rt

解决方案 »

  1.   

    setwindowshookex();网上有代码,稍微改改就是行了
      

  2.   

    我在dll里这样写的extern "C" _declspec(dllexport) void SetHook()
    {
    if(g_hMessage != NULL)
    {
    UnhookWindowsHookEx(g_hMouse); 
    }
    g_hMessage = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc,g_hstance,0);
    }LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    /*if(nCode < 0 ) 
    return ::CallNextHookEx(g_hMouse, nCode, wParam, lParam); */ MSG *lptemp =(MSG *)lParam;
    if(lptemp->message == WM_SYSCOMMAND   /*&& lptemp->wParam == SC_MINIMIZE*/)
    SendMessage(hwnd,WM_SCREEN_LBUTTONDOWN,0,0); return 0;
    }
    为什么捕获不到WM_SYSCOMMAND消息呢?
      

  3.   

    据msdn, WH_GETMESSAGE 只能 hook procedure that monitors messages posted to a message queue,也就是PostMessage,你用WH_CBT看看,就该可以的,
    LRESULT CALLBACK CBTProc(          int nCode,
        WPARAM wParam,
        LPARAM lParam
    )
    {
       if (HCBT_MINMAX == nCode && SW_MINIMIZE == LOWORD(lParam)) //最小化
      

  4.   

    有关窗口创建激活最大化最小化等  应该用 WH_CBT钩子
      

  5.   


    把setwindowshook代码写入dll,把最后一个参数设为0,全局hook
      

  6.   

    问题解决了对于其它进程的消息,CBTProc函数是在相应的进程中被调用的,在你调试程序的时候,你所调试的只是自己的进程,当其它进程中调用CBTProc函数时调试器不会察觉,所以使你误以为收不到其它进程的消息。你可以在CBTProc函数中通过写日志文件的方式来记录消息,注意:文件句柄是只在本进程内有效的,每次写文件都要执行打开和关闭文件操作,不能通过全局变量(包括共享变量)保存句柄。