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

Obtaining a list of user-relevant processes/windows

本文关键字:窗口 列表 获取 用户      更新时间:2023-10-16

因此,我正在构建一个程序,该程序根据是否正在运行用户定义的进程有条件地复制某些文件。现在,由于用户正在选择该过程,因此我想过滤他们可以选择的过程,以将其选择为他们真正关心的内容。从本质上讲,我只想要可以贴上替代的过程/窗口。我找到了几种获取跑步过程的方法,但是我没有太多运气来弄清楚如何将它们过滤到我想要的东西。现在,这是我用来获取过程名称&的代码。窗口名称,但我觉得可能有更好的方法:

(仅供参考,我正在为此使用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));

任何建议将不胜感激!谢谢!

这与任务栏过滤窗口的方式非常相似。

您似乎很近,但是您应该检查窗口是否可见,WS_EX_APPWINDOW允许将工具窗口视为普通窗口。