c - 如何获取当前事件的 Windows 资源管理器窗口的 HWND?

标签 c winapi windows-explorer

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

但我一直没能找到返回当前事件 的HWND 的函数Windows Explorer主窗口。

如何以安全可靠的方式获取当前事件的 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() )。

关于c - 如何获取当前事件的 Windows 资源管理器窗口的 HWND?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6298907/

相关文章:

c - 如何检查文件是否正在被另一个应用程序使用?

c# - 从 Windows 资源管理器拖放到我的应用程序的文本框中

c# - 如何删除气球工具提示上的 "wrench"按钮?

perl - 是否可以在使用脚本创建 SVG 之前确定文本字符串的(像素)宽度

有人可以帮助修复我的 while 循环吗?它永远运行

c - 使用 fscanf 读取 ASCII 码文件

x86 寄存器重命名的成本

windows - GetOpenFileName 在 64 位中失败,但在 32 位中有效?

c# - 刷新 Windows 资源管理器窗口(无法使内联 C# 代码在 PowerShell 函数中正常运行)

c - 在 C 中获取键盘中断