使用API函数EnumWindows()枚举顶层窗口

 
http://simpleease.blog.163.com/blog/static/1596085820052770290/

   要枚举Windows当前所有打开的顶层窗口,可使用Windows API函数EnumWindows():
                BOOL EnumWindows( WNDENUMPROC lpEnumFunc,  LPARAM lParam);

   具体使用方法如下所示(将指定ProcessID的进程对应窗口置于前台):

        BOOL CALLBACK EnumWindows_SetForegruond_Proc(HWND hwnd, LPARAM lParam)
        {
                DWORD dwPID = 0;
                GetWindowThreadProcessId(hwnd, &dwPID);
                if(dwPID == (DWORD)lParam)
                {
                       ::SetForegroundWindow(hwnd);
                       ::ShowWindow(hwnd, SW_SHOWNORMAL);
                       return FALSE;
                }
                return TRUE;
        }//~End of EnumWindows_SetForegruond_Proc()

        ......
        //以下hProcess为指定窗口的进程句柄HANDLE
        DWORD dwPID = GetProcessId(hProcess);
        EnumWindows(EnumWindows_SetForegruond_Proc, dwPID);

   但是使用上面方法似乎也有个小问题。例如我的HANDLE是通过执行ShellExecuteEx(...)获得的,上面代码虽然执行了EnumWindows_SetForegruond_Proc(),但是并没有将窗口置于前台(好像是因为找不到值为dwPID的进程ID)?而在调试模式下,再执行调用 EnumWindows(EnumWindows_SetForegruond_Proc, dwPID)之前加入一个断点,一步一步执行,操作就成功了!为何?问题待解决ing......
   

jpg改rar
 
原文地址:https://www.cnblogs.com/kuangke/p/9524644.html