具有 enumwindows 接口和进程的程序列表

Posted

技术标签:

【中文标题】具有 enumwindows 接口和进程的程序列表【英文标题】:list of programs with interface and processes with enumwindows 【发布时间】:2017-09-08 12:32:54 【问题描述】:

我需要找到所有带有图形界面的打开窗口及其进程,我真的不知道该怎么做。我已经写了一些代码,但我只是成功地找到了打开的窗口:

HWND hwnd = GetForegroundWindow(); // get handle of currently active window
GetWindowText(hwnd, wnd_title, sizeof(wnd_title));
cout << "Window with focus: " << wnd_title << endl << endl;

EnumWindows(EnumWindowsProc, 0); 

EnumWindowsProc 是这样定义的:

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)

    char class_name[80];
    char title[80];

    if (IsWindowVisible(hwnd)) 
        GetClassName(hwnd, class_name, sizeof(class_name));
        GetWindowText(hwnd, title, sizeof(title));
        cout << "Window title: " << title << endl;
        cout << "Class name: " << class_name << endl << endl;
       
    return TRUE;

有人可以帮助我吗?

【问题讨论】:

【参考方案1】:

我建议你不要检查IsWindowVisible是否因为

如果指定的窗口、其父窗口、其父的父窗口等具有WS_VISIBLE 样式,则返回值非零。否则,返回值为零。 因为返回值指定了窗口是否具有 WS_VISIBLE 样式,所以即使窗口被其他窗口完全遮挡,它也可能是非零的。

在枚举窗口时,您可以使用DWORD WINAPI GetWindowThreadProcessId(_In_ HWND hWnd, _Out_opt_ LPDWORD lpdwProcessId); 检索与特定HWND 相关的进程ID。

例子:

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)

    char class_name[80];
    char title[80];
    DWORD dwProcessId;
    GetClassName(hwnd,class_name, sizeof(class_name));
    GetWindowText(hwnd,title,sizeof(title));

    // get process id based on hwnd
    GetWindowThreadProcessId(hwnd, &dwProcessId);

    std::cout << "Window title: "<< title << std::endl;
    std::cout << "Class name: "<< class_name << std::endl
    // display process id based on hwnd
    std::cout << "Process Id: " << dwProcessId  << std::endl;

    return TRUE;

【讨论】:

能找到每个窗口对应的应用程序吗? @ica 是的,这应该完全符合您的需要,但我不确定它是否不会显示重复的进程 ID,因为一个进程可以有多个窗口。 因为我还需要找到与打开的应用程序关联的图标,我不知道是否可以从 windows 中找到它 @ica 获取图标相当简单,您只需致电GetClassLong(hwnd, GCL_HICON); 该函数返回句柄...我需要将图标发送给客户端...是否可以使用句柄?

以上是关于具有 enumwindows 接口和进程的程序列表的主要内容,如果未能解决你的问题,请参考以下文章

使用 EnumWindows 找到满足你要求的窗口

Python中pyqt QWebEngineView win32gui EnumWindows程序崩溃

Windows API 编程----EnumWindows()函数的用法

Visual Studio 跳过代码行

具有类似 STL 接口的 Python 列表

操作系统概念 文件系统接口