【问题标题】:Enumerate all window handles on desktop枚举桌面上的所有窗口句柄
【发布时间】:2009-06-23 14:31:51
【问题描述】:

是否有 Win32 API 方法来获取所有打开的窗口的枚举?似乎肯定只是不确定从哪里开始寻找。

【问题讨论】:

    标签: c windows winapi


    【解决方案1】:

    EnumWindows() 就是为了这个。您调用它并提供回调。它为每个找到的窗口调用回调并将句柄传递给该窗口。

    然后您可以使用句柄来查询窗口参数并决定您是否感兴趣或对它执行一些操作。

    【讨论】:

      【解决方案2】:

      您需要在 user32.dll 中使用 EnumDesktopWindows 函数。

      这里有一些 C# 代码可以帮助您指出正确的 API 调用。我不确定这在 C 中会是什么样子,但你明白了。

      [DllImport("user32.dll")]
      private static extern int EnumDesktopWindows(IntPtr hDesktop, EnumWindowsProc ewp, int lParam);
      

      【讨论】:

        【解决方案3】:

        我想一个例子可以更清楚地说明这个过程

        #include <windows.h>
        
        BOOL CALLBACK printVisibleWindows(HWND wnd, LPARAM lParam)
        {
            if(!IsWindowVisible(wnd))return 1;
            int length = GetWindowTextLength(wnd);
            if(!length)return 1;
            length++;
            TCHAR *buffer = (TCHAR*)malloc(length);
            GetWindowText(wnd, buffer, length);
            printf("%p %s\n", wnd, buffer);
            free(buffer);
            return 1;
        }
        
        int main()
        {
            DWORD dwThreadId = GetCurrentThreadId();
            HDESK hDesktop = GetThreadDesktop(dwThreadId);
            EnumDesktopWindows(hDesktop, printVisibleWindows, 0);
            return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-29
          • 1970-01-01
          • 1970-01-01
          • 2015-04-18
          • 1970-01-01
          • 1970-01-01
          • 2011-03-02
          • 1970-01-01
          相关资源
          最近更新 更多