另外调用是在GINA.DLL的DLLMain里面,初始化的时候调用了SetHook(1)

解决方案 »

  1.   

    我想问一下,你是在GINA桌面上进行HOOK,在GINA桌面时你做测试应该可以HOOK到的吧,你HOOK不到应该是你在应用程序桌面HOOK不到,是吗?
    我以前是写键盘HOOK来进行测试的,也出现同样问题的。
      

  2.   

    什么叫做Gina桌面进行hook,还是应用程序桌面hook?
    我不太明白,我是在DLLMain里面,DLL_PROCESS_ATTACH的时候建立的hook,那是刚启动,应该还没有Logon用户,也没有建立桌面,我应该在那里建立hook才能得到这个消息?我都怀疑Key有没有这个消息了。
    试了两个办法,hook根本没发现这个消息,建立隐藏的对话框就会不停的执行WM_DEVICECHANGE那句case,也不对,不知道应该怎么处理。
      

  3.   

    我的意思是说,你的HOOK是在GINA里加载的,它只工作在Winlogon desktop,你在登录窗口出现的时候应该可以HOOK到消息的吧。
    KEY是肯定有这个消息的,你可以在User desktop里写个简单对话框试试就知道了。
    这只是我以前研究过的结果,不知正确与否。
      

  4.   

    我的意思是说你的HOOK是在WINLOGON DESKTOP建立的,你只能HOOK WINLOGON DESKTOP上的消息,你在登录对话框出现时,应该可以HOOK到消息的吧。
    KEY是肯定有这个消息的,你在USER DESKTOP建一个简单程序测试一下就知道了。
    这只是我以前研究的结果,不知道正确与否。
      

  5.   

    :)为什么说两遍?都是你的ID啊?hook只能得到哪一个桌面的消息?有没有更全局的hook?我必须监视所有的桌面阿。登录以后的桌面,锁住桌面以后的桌面,这两个桌面一样么?
    我用隐藏的非模态对话框监测到了这个消息,只是还有点问题。我开了一个隐藏的非模态对话框监视系统消息,发现可以截获到WM_DEVICECHANGE但是,在windows一启动的时候会有几个这样的消息,不知道为什么,另外,Key插上去的时候一点问题没有,但是拔下来的时候,可能会收不到,比如说运行了一个另外的程序,或者是启动我的电脑,或者是在桌面上点几下鼠标,就收不到了,而如果我进入了一个至少两层的目录,比如:C:\windows\system32,或者我访问一下那个我自己的Log文件,就可以收到这个消息。谁知道为什么会有这种现象?
      

  6.   

    这两个桌面是肯定不一样的,WINLOGON有个函数可以切换两个桌面,你在WINLOGON桌面可以HOOK到USER DESKTOP的USB KEY的消息?你是通过LOG文件来记录的吧。
    在WINDOWS一启动时的几条WM_DEVICE消息,可能是其他设备的,你只要判断USB KEY的消息就可以了。
    至于你说的拔出时有时收不到的现象,我觉得好象没道理的。
      

  7.   

    那我就不能用全局钩子了?这样满足不了我的要求,我要找到两个桌面的消息才行。
    至于收不到消息,会不会是因为我用了对话框来接受消息,所以有的消息找不到?我的对话框代码如下,请 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;
    }
      

  8.   

    现在我也不能确定在USER DESKTOP上的USB KEY插拔WINLOGON DESKTOP是否能收到,你可以写LOG文件来记录一下,GINA调试起来太麻烦了。
    至于你的对话框程序,我看不出问题来,你也可以记录一下来确定是否一定收不到消息。
      

  9.   

    发现问题所在,KEY必须要在系统托盘里面点击停止设备,提示可以安全移除设备的时候,就肯定会有WM_DEVICECHANGE,但是如果不是安全移除,而是直接拔掉,就可能收不到这个消息,系统如上面所述,最后一次访问的必须是一个目录或者一个文件才收到这个消息,而其他情况:访问其他程序,我的电脑,甚至点击了桌面,都不会收到这个消息,谁知道如何才能真正的检测到KEY的消息呢?
      

  10.   

    那是你的USB KEY的驱动程序有问题,好象有个什么消息没处理,这好象是在2000里才会出来的,你可以做个对话框在98/ME里试试,肯定可以收到拔出消息的。
      

  11.   

    在我的记忆中USB Key是不能要通常方式的钩子来截取的,好象Microsoft有个未公开的钩子类型好象是什么WH_MESSAGE_LOW_LEVEL,我不记得是不是这个了,你不妨找找看,我下次在贴上来.