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

Win*_*Win 1 c winapi windows-explorer

我知道如何获得桌面的HWND:GetDesktopWindow().

但是我找不到一个返回当前活动的 Windows资源管理器主窗口的HWND的函数.

如何以安全可靠的方式获取当前活动的Windows资源管理器窗口的HWND?

Mik*_*wan 7

您可以通过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 );
Run Code Online (Sandbox Code Playgroud)

要获得所有打开的资源管理器窗口,您可以使用EnumWindows(),它提供一个回调函数,接收所有顶级窗口.然后,您可以根据需要过滤掉,可能是按进程名称(上面),也可以按类名(GetClassName())过滤掉.