我的钩子抓不到USB KEY,谁能帮忙看看。 另外调用是在GINA.DLL的DLLMain里面,初始化的时候调用了SetHook(1) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我想问一下,你是在GINA桌面上进行HOOK,在GINA桌面时你做测试应该可以HOOK到的吧,你HOOK不到应该是你在应用程序桌面HOOK不到,是吗?我以前是写键盘HOOK来进行测试的,也出现同样问题的。 什么叫做Gina桌面进行hook,还是应用程序桌面hook?我不太明白,我是在DLLMain里面,DLL_PROCESS_ATTACH的时候建立的hook,那是刚启动,应该还没有Logon用户,也没有建立桌面,我应该在那里建立hook才能得到这个消息?我都怀疑Key有没有这个消息了。试了两个办法,hook根本没发现这个消息,建立隐藏的对话框就会不停的执行WM_DEVICECHANGE那句case,也不对,不知道应该怎么处理。 我的意思是说,你的HOOK是在GINA里加载的,它只工作在Winlogon desktop,你在登录窗口出现的时候应该可以HOOK到消息的吧。KEY是肯定有这个消息的,你可以在User desktop里写个简单对话框试试就知道了。这只是我以前研究过的结果,不知正确与否。 我的意思是说你的HOOK是在WINLOGON DESKTOP建立的,你只能HOOK WINLOGON DESKTOP上的消息,你在登录对话框出现时,应该可以HOOK到消息的吧。KEY是肯定有这个消息的,你在USER DESKTOP建一个简单程序测试一下就知道了。这只是我以前研究的结果,不知道正确与否。 :)为什么说两遍?都是你的ID啊?hook只能得到哪一个桌面的消息?有没有更全局的hook?我必须监视所有的桌面阿。登录以后的桌面,锁住桌面以后的桌面,这两个桌面一样么?我用隐藏的非模态对话框监测到了这个消息,只是还有点问题。我开了一个隐藏的非模态对话框监视系统消息,发现可以截获到WM_DEVICECHANGE但是,在windows一启动的时候会有几个这样的消息,不知道为什么,另外,Key插上去的时候一点问题没有,但是拔下来的时候,可能会收不到,比如说运行了一个另外的程序,或者是启动我的电脑,或者是在桌面上点几下鼠标,就收不到了,而如果我进入了一个至少两层的目录,比如:C:\windows\system32,或者我访问一下那个我自己的Log文件,就可以收到这个消息。谁知道为什么会有这种现象? 这两个桌面是肯定不一样的,WINLOGON有个函数可以切换两个桌面,你在WINLOGON桌面可以HOOK到USER DESKTOP的USB KEY的消息?你是通过LOG文件来记录的吧。在WINDOWS一启动时的几条WM_DEVICE消息,可能是其他设备的,你只要判断USB KEY的消息就可以了。至于你说的拔出时有时收不到的现象,我觉得好象没道理的。 那我就不能用全局钩子了?这样满足不了我的要求,我要找到两个桌面的消息才行。至于收不到消息,会不会是因为我用了对话框来接受消息,所以有的消息找不到?我的对话框代码如下,请 mjian(红蜻蜓) 帮忙看看吧。:)谢谢DWORD WINAPI CreateMyDialog(LPVOID lpParameter){ MSG imsg; if(g_hWnd)return 0; g_hWnd=CreateDialog(myHandle,MAKEINTRESOURCE(IDD_WARN),NULL,MyDialogProc); ShowWindow(g_hWnd,SW_HIDE); while (GetMessage(&imsg, NULL, 0,0) != 0 && GetMessage(&imsg, (HWND) NULL, 0, 0) != -1) { if (!IsWindow(g_hWnd) || !IsDialogMessage(g_hWnd, &imsg)) { TranslateMessage(&imsg); DispatchMessage(&imsg); } } return 0;} //检测Key的对话框程序BOOL CALLBACK MyDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) { int rtn_code,strLen,Len; //int result; unsigned char strNamePass[256]; switch (message) { case WM_INITDIALOG : return TRUE; case WM_DEVICECHANGE: result = pGlobalWlxFuncs->WlxDialogBoxParam( hGlobalWlx, hGlobalDllInstance, (LPTSTR) MAKEINTRESOURCE(IDD_WARN), NULL, WarnDlgProc, (LPARAM) pGlobalContext ); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)){ case IDCANCEL: DestroyWindow(hwndDlg); g_hWnd = NULL; ExitThread(0); return TRUE; } } return FALSE;} 现在我也不能确定在USER DESKTOP上的USB KEY插拔WINLOGON DESKTOP是否能收到,你可以写LOG文件来记录一下,GINA调试起来太麻烦了。至于你的对话框程序,我看不出问题来,你也可以记录一下来确定是否一定收不到消息。 发现问题所在,KEY必须要在系统托盘里面点击停止设备,提示可以安全移除设备的时候,就肯定会有WM_DEVICECHANGE,但是如果不是安全移除,而是直接拔掉,就可能收不到这个消息,系统如上面所述,最后一次访问的必须是一个目录或者一个文件才收到这个消息,而其他情况:访问其他程序,我的电脑,甚至点击了桌面,都不会收到这个消息,谁知道如何才能真正的检测到KEY的消息呢? 那是你的USB KEY的驱动程序有问题,好象有个什么消息没处理,这好象是在2000里才会出来的,你可以做个对话框在98/ME里试试,肯定可以收到拔出消息的。 在我的记忆中USB Key是不能要通常方式的钩子来截取的,好象Microsoft有个未公开的钩子类型好象是什么WH_MESSAGE_LOW_LEVEL,我不记得是不是这个了,你不妨找找看,我下次在贴上来. boost的ipc需谨慎应用,有BUG。 MD5校验大文件如何知道校验多少? 采用Oracle数据库,vc查询语句,如何绑定变量? 请问:在vc中怎么用stl?? CComboBox的消息 在线问题:Access 问题 为什么打印机打出来的字体与在对话框设备环境上相比大好多好多? 简单问题,我应该在哪里加参数/MT LNK2001错误 关于消息处理的问题 我刚刚学vc想问一个简单问题:如何编写程序来显示系统时间? 高分请教关于USBKEY、GINA(续)
我以前是写键盘HOOK来进行测试的,也出现同样问题的。
我不太明白,我是在DLLMain里面,DLL_PROCESS_ATTACH的时候建立的hook,那是刚启动,应该还没有Logon用户,也没有建立桌面,我应该在那里建立hook才能得到这个消息?我都怀疑Key有没有这个消息了。
试了两个办法,hook根本没发现这个消息,建立隐藏的对话框就会不停的执行WM_DEVICECHANGE那句case,也不对,不知道应该怎么处理。
KEY是肯定有这个消息的,你可以在User desktop里写个简单对话框试试就知道了。
这只是我以前研究过的结果,不知正确与否。
KEY是肯定有这个消息的,你在USER DESKTOP建一个简单程序测试一下就知道了。
这只是我以前研究的结果,不知道正确与否。
我用隐藏的非模态对话框监测到了这个消息,只是还有点问题。我开了一个隐藏的非模态对话框监视系统消息,发现可以截获到WM_DEVICECHANGE但是,在windows一启动的时候会有几个这样的消息,不知道为什么,另外,Key插上去的时候一点问题没有,但是拔下来的时候,可能会收不到,比如说运行了一个另外的程序,或者是启动我的电脑,或者是在桌面上点几下鼠标,就收不到了,而如果我进入了一个至少两层的目录,比如:C:\windows\system32,或者我访问一下那个我自己的Log文件,就可以收到这个消息。谁知道为什么会有这种现象?
在WINDOWS一启动时的几条WM_DEVICE消息,可能是其他设备的,你只要判断USB KEY的消息就可以了。
至于你说的拔出时有时收不到的现象,我觉得好象没道理的。
至于收不到消息,会不会是因为我用了对话框来接受消息,所以有的消息找不到?我的对话框代码如下,请 mjian(红蜻蜓) 帮忙看看吧。:)谢谢DWORD WINAPI CreateMyDialog(LPVOID lpParameter)
{
MSG imsg;
if(g_hWnd)return 0; g_hWnd=CreateDialog(myHandle,MAKEINTRESOURCE(IDD_WARN),NULL,MyDialogProc);
ShowWindow(g_hWnd,SW_HIDE);
while (GetMessage(&imsg, NULL, 0,0) != 0 && GetMessage(&imsg, (HWND) NULL, 0, 0) != -1)
{
if (!IsWindow(g_hWnd) || !IsDialogMessage(g_hWnd, &imsg))
{
TranslateMessage(&imsg);
DispatchMessage(&imsg);
}
}
return 0;
} //检测Key的对话框程序
BOOL CALLBACK MyDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
int rtn_code,strLen,Len;
//int result;
unsigned char strNamePass[256]; switch (message)
{
case WM_INITDIALOG :
return TRUE;
case WM_DEVICECHANGE:
result = pGlobalWlxFuncs->WlxDialogBoxParam( hGlobalWlx, hGlobalDllInstance, (LPTSTR) MAKEINTRESOURCE(IDD_WARN), NULL, WarnDlgProc, (LPARAM) pGlobalContext ); return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)){
case IDCANCEL:
DestroyWindow(hwndDlg);
g_hWnd = NULL;
ExitThread(0);
return TRUE; }
} return FALSE;
}
至于你的对话框程序,我看不出问题来,你也可以记录一下来确定是否一定收不到消息。