我知道如何获得桌面的HWND: GetDesktopWindow() 。
但是我找不到一个返回当前活动的 Windows资源管理器主窗口的HWND的函数。
如何以安全可靠的方式获取当前活动的Windows资源管理器窗口的HWND?
您可以通过GetForegroundWindow()获取当前活动的窗口。 然后,您可以执行GetWindowThreadProcessId()以获取PID,然后可以使用OpenProcess()转换为进程句柄(您将需要PROCESS_QUERY_INFORMATION和PROCESS_VM_READ访问权限),然后可以使用GetModuleFileNameEx()检查进程名称。 不记得以后用CloseHandle()关闭进程句柄。
这是我刚在记事本中写的一些代码。 你可能会沿着这些方向做点什么。
DWORD lpFileName[MAX_PATH] = {0}; DWORD dwPID; HANDLE hProcess; HWND hwnd = GetForegroundWindow(); GetWindowThreadProcessId( hwnd, &dwPID ); hProcess = OpenProcess( PROCESS_QUERY_INFOMRATION | PROCESS_VM_READ, false, dwPID ); GetModuleFileNameEx( hProcess, NULL, lpFileName, _countof( lpFileName ) ); PathStripPath( lpFileName ); if( _tcscmp( _T("explorer.exe"), lpFileName ) == 0 ) { _tprintf( _T("explorer window found") ); } else { _tprintf( _T("foreground window was not explorer window") ); } CloseHandle( hProcess );
要获得所有打开的资源管理器窗口,您可以使用EnumWindows() ,它提供一个回调函数,接收所有顶级窗口。 然后,您可以根据需要过滤掉,可能是按进程名称(上面),也可以按类名( GetClassName() )过滤掉。
好吧,如果您确定Windows资源管理器窗口当前是前台窗口,则可以使用GetForegroundWindow 。 否则,我认为你必须枚举所有窗口,直到你找到最顶层的资源管理器窗口。 这是一个我写的如何枚举所有窗口* 的例子 。 然后,根据此SO线程 ,您可以使用GetWindowThreadProcessId来过滤Explorer拥有的窗口。
*已经有一段时间了,但我认为 EnumWindows从z顺序的顶部迭代到底部。
以上就是c/c++开发分享如何获取当前活动的Windows资源管理器窗口的HWND?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/562684.html