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

时间:2011-06-09 20:35:46

标签: c winapi windows-explorer

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

但是我找不到一个返回当前活动 Windows Explorer主窗口的HWND的函数。

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

2 个答案:

答案 0 :(得分:7)

您可以通过GetForegroundWindow()获取当前有效的窗口。然后,您可以GetWindowThreadProcessId()获取一个PID,然后可以转换为具有OpenProcess()的进程句柄(您将需要PROCESS_QUERY_INFORMATION和PROCESS_VM_READ访问权限),然后您可以使用{{3来检查进程名称}}。不记得以后用GetModuleFileNameEx()关闭进程句柄。

这是我刚在记事本中写的一些代码。你可能会沿着这些方向做点什么。

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 );

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

答案 1 :(得分:2)

好吧,如果您确定Windows资源管理器窗口当前是前台窗口,则可以使用GetForegroundWindow。否则,我认为你必须枚举所有窗口,直到找到最顶层的资源管理器窗口。 Here's an example我写了如何通过所有窗口进行枚举*。然后,根据this SO thread,您可以使用GetWindowThreadProcessId过滤资源管理器拥有的窗口。

*已经有一段时间了,但我认为 EnumWindows从z顺序的顶部迭代到底部。