如何获取当前活动的Windows资源管理器窗口的HWND?

我知道如何获得桌面的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顺序的顶部迭代到底部。