使用Win32API,是否可以在一个线程中创建一个窗口或对话框,然后从另一个线程为它收集事件?HWND是否绑定(bind)到线程?尝试下面这个人为的例子,我从来没有看到GetMessage()触发。HWNDg_hWnd;DWORDWINAPImyThreadProc(LPVOIDlpParam){while(GetMessage(&msg,hWnd,0,0)>0){...}}intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnShowCmd){hWnd=CreateDialog(hI
有开发者问了这样一个问题:既然SetWindowsHookEx的第一个参数总是会被转换为一个文件名,那为什么它的传参类型是HINSTANCE呢?这岂不是多此一举?原因是这样的:在16位Windows系统上,它不是这样工作的。16位Windows上根本就没有“钩子注入”的概念。所有16位Windows应用程序都是运行在同一个地址空间,所以就没有必要将代码注入到其他程序中。所以,就没有必要将实例句柄转换为一个文件名来注入代码。实际的工作原理是这样的:实例句柄将会被用来增加引用计数,从而钩子函数就不会被意外释放掉。当钩子被卸载的时候,模块的引用计数会自动减一。即使到了32位Windows,窗口管理器
在单个.exe应用程序中,WinMain入口点有一个HINSTANCE参数,它应该是一个伪句柄(因为等同于GetModuleHandle(NULL)返回一个伪句柄,根据MSDN)。我想它是伪,因为有特殊值(例如NULL表示入口点模块)和用于返回错误的常量(小于32)。MSDN明确地将其描述为指向模块基地址的指针(现在相当于HMODULE);我们知道这对于16位应用程序可能具有完全不同的含义,但在32/64位世界中每个进程都有自己的地址空间然后它的exact值是无用的,每个实例可能总是相同的并且绝对在其过程之外毫无意义。综上所述,这是我的第一个问题:我们能否(正式地,尽管MSDN似乎自相