获取由库调用创建的窗口的Window Handle (HWND)
Get Window Handle (HWND) of a window created by a library call
编辑:我忘了提,我没有创建窗口的DLL的源代码,所以我实际上不能改变函数返回HWND。
我正在创建一个Win32应用程序,我正在使用一个DLL,通过它的一个导出函数"void X()"为我创建一个窗口;我在WinMain()中调用X()
它确实为我创建了一个窗口。我想获得这个导出的库函数创建的窗口的HWND,因为X()返回void,所以我可以将它用于其他API调用。有人能告诉我去HWND最容易吗?
我已经在这里搜索并回答了问题,但我无法找到确切的,适当的解决方案。我尝试了EnumWIndows(),然后获得进程ID,然后与当前线程进程ID进行比较。但我想应该有一种更好、更有效、更简单的方法来获得HWND。毕竟,我是在创建这个窗口的进程的WinMain中。
如果我需要解释什么,我错过了写在这里,请告诉我。
我确信这是非常基本的,我在这里明显遗漏了一些东西。对不起。谢谢,的问候!
使用spy++或Winspector等工具查看应用程序创建的所有HWND
,特别是它们的类名和窗口标题。然后,您可以将这些值复制到您的代码中,并在DLL创建其窗口后对FindWindow()
进行单个调用,例如:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// ...
X();
HWND hWnd = FindWindow("ClassNameHere", "TitleHere");
// ...
return 0;
}
最简单的方法是使用SetWindowsHookEx(WH_CBT, fun, NULL, GetCurrentThreadId())
函数。然后,当许多事件发生时,将调用您定义的回调函数fun
。你想要的是HCBT_CREATEWND
。
有人这样认为(完全未经测试):
HWND hDllHandle = NULL;
LRESULT CALLBACK X_CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HCBT_CREATEWND)
hDllHandle = (HWND)wParam;
return CallNextHookEx(NULL, nCode, wParam, lParam); //The first parameter is useless
}
HWND CallXAndGetHWND()
{
HHOOK hDllHook = SetWindowsHookEx(WH_CBT, X_CBTProc, NULL, GetCurrentThreadId());
X();
UnhookWindowsHookEx(hDllHook);
//hDllHandle is a global variable, so will be now you window!
return hDllHandle;
}
注意,这个函数不是线程感知的,但很可能你只会在代码的开头调用它一次,所以它应该无关紧要。
,小心!许多函数,甚至是Win32 API函数,都会创建隐藏窗口。这段代码将钩住所有的对象,并返回最后一个要创建的对象。如果需要,将其更改为返回任何其他的,甚至是一个列表,应该是微不足道的。
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 获取 SFML 窗口的 HWND 和高可用性?
- 如何获取边缘窗口句柄 (HWND)?
- protobuf C++ SQLite handle blob data
- 标识符"hWnd"未定义
- Win32 API - HWND "{unused = ???} Unable to read memory"错误
- 通过比较 GetCurrentProcessId();获得正确的 HWND
- 我需要通过窗口句柄(HWND)获取文件,我该怎么办?
- 由于选项卡顺序的原因,鼠标光标总是得到错误的hwnd-MFC应用程序
- 枚举 HWND 属性 c++
- C++ libtins "An invalid handle was specified"
- 在C++中将 HWND 转换为十六进制字符串
- 从 HWnd 获得永久 CWnd
- 创建D2D1工厂和HWND渲染目标
- 获取我单击的窗口的 HWND
- 尝试执行任何需要它的操作时,无法修复 WinAPI 中的"invalid handle"错误
- hwnd 设置高位是否正常
- 设置 VLC drawable-hwnd 仍会创建一个新窗口
- Windows HANDLE RAII 管理,如果返回布尔值而不是句柄怎么办?
- 获取由库调用创建的窗口的Window Handle (HWND)