求助:全局钩子如何截获非top-level窗口
问题一:
使用SetWindowsHookEx(WH_CBT, ShellProc, ghInstance, 0)做的全局钩子,在ShellProc()中通过HCBT_CREATEWND截获创建的窗口。但是只能截获Top-level窗口(MSDN中也是这么说的)。
但是目前有以下的应用:
通过服务程序监控某些usb设备的插入,在举出相应的com口后安装驱动。由于没有数字签名,安装驱动的过程中会弹出“驱动数字签名警告”窗口,但它不是Top-level窗口(通过SPY看到它的父窗口没有标题而且是不显示的),无法通过前面的挂钩截获到。像这种非Top-level的窗口的创建消息如何用全局钩子截获呢?
问题二:
由于上面问题暂时没有办法解决,就采用替代的方法:在服务程序中创建一个线程轮询窗口来获得“驱动数字签名警告”窗口(我是做了一个dll,在其中创建的线程,服务程序开启时调用dll的接口做的)。但是也没有截获到改窗口。由于我在服务程序中还做了其他事情,都是正常的,由此可以判断服务程序没有问题;此外,将这个dll挂在一个测试用的mfc程序上也是可以截获到该窗口的,说明这个dll没问题。dll的相关函数如下:
void __stdcall Start(void)
{
ghThread = (HANDLE)_beginthreadex(NULL, 0, Proc, NULL, 0, &gnThreadID);
}
static UINT __stdcall Proc(void *pParam)
{
while(1)
{
EnumWindows(EnumWindowsProc, 0);
Sleep(200);
}
return 0;
}
在服务程序中这样使用会有什么问题呢?