获取与用户相关的流程/窗口列表

时间:2017-04-18 13:04:45

标签: c++ windows

因此,我正在构建一个程序,根据用户定义的进程是否正在运行来有条件地复制某些文件。现在,由于用户正在选择流程,我想过滤他们可以选择的流程,直到他们真正关心的流程。基本上我只想要可以alt-tabbed的进程/窗口。我已经找到了一些方法来获取正在运行的流程,但我还没有多少运气想出如何将它们过滤到我正在寻找的东西。现在,这是我用来获取流程名称和代码的代码。窗口名称,但我觉得这可能是更好的方法:

(仅供参考,我正在使用QT,以便QString和QStringLists来自哪里)

HWND hwnd_current = GetWindow(GetDesktopWindow(), GW_CHILD);
QStringList process_list;
do {
    wchar_t str_window_name[MAX_PATH];
    DWORD pid;
    DWORD exStyles = (DWORD)GetWindowLongPtr(hwnd_current, GWL_EXSTYLE);
    DWORD styles = (DWORD)GetWindowLongPtr(hwnd_current, GWL_STYLE);

    if(!((exStyles & WS_EX_TOOLWINDOW) == 0 && (styles & WS_CHILD) == 0)){
        continue;
    }
    if(!GetWindowText(hwnd_current, str_window_name, MAX_PATH)){
        continue;
    }
    GetWindowThreadProcessId(hwnd_current, &pid);
    if(pid == GetCurrentProcessId()){
        continue;
    }

    wchar_t fileName[MAX_PATH];
    LPWSTR file_name;
    HANDLE hProcess;
    hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_VM_READ, FALSE, pid);
    if(hProcess){
        DWORD dwSize = MAX_PATH;
        QueryFullProcessImageName(hProcess, 0, fileName, &dwSize);
        file_name = PathFindFileName(fileName);
    }
    CloseHandle(hProcess);
    QString boxString = QString("[");
    #ifdef UNICODE
    QString q_file_name = QString::fromStdWString(file_name);
    QString q_str_window_name = QString::fromStdWString(str_window_name);
    #else
    QString q_file_name = QString::fromStdString(file_name);
    QString q_str_window_name = QString::fromStdString(str_window_name);
    #endif
    boxString.append(q_file_name);
    boxString.append("] ");
    boxString.append(q_str_window_name);

    if(!q_file_name.isEmpty() && !q_str_window_name.isEmpty() && !pNameList.contains(boxString) && !process_list.contains(q_file_name)){
        if(!q_str_window_name.endsWith("MSCTFIME UI") && !q_str_window_name.endsWith("Default IME")){
            process_list.append(q_file_name);
            pNameList.append(boxString);
        }
    }

} while (hwnd_current = GetNextWindow(hwnd_current, GW_HWNDNEXT));

任何建议都将非常感谢!谢谢!

1 个答案:

答案 0 :(得分:1)

这与taskbar filters windows非常相似。

您似乎非常接近,但您应检查窗口是否可见,WS_EX_APPWINDOW允许工具窗口为treated as a normal window