写了一个简单的全局钩子dll和试验的对话框程序,结果发现当对话框程序不是当前窗口的时候钩子就不好使,只有在exe程序是当前窗口的时候才行。大家帮忙给看看撒。多谢啦。
#include "stdafx.h"
#include "hook.h"/************************************************************************/
/* 全局变量声明                                                         */
/************************************************************************/
HWND       g_hMainWnd;     //保存接收勾到的消息的窗口句柄
HHOOK      g_hHook;
HINSTANCE  g_hInstance;
BOOL APIENTRY DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    g_hInstance = hInstance;
    return TRUE;
}
long SetKeyBoardHook(HWND HMainWnd)
{   //这里把对话框的窗口句柄传进来
    if (!HMainWnd) 
    {
        return ERR_CODE_INVALID_PARAMETER;
    }    g_hMainWnd = HMainWnd;    g_hHook = ::SetWindowsHookEx(WH_KEYBOARD, hookProc, g_hInstance, 0);
    if (g_hHook == NULL) 
    {
        return ::GetLastError();
    }    return ERR_CODE_OK;
}
long UnSetKeyBoardHook()
{
    BOOL rt = UnhookWindowsHookEx(g_hHook);
    return !rt;
}LRESULT CALLBACK hookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
         //后来干脆在这里加了一句,但是仍然是如果对话框不是当前窗口就收不到这个消息。
         //::PostMessage(g_hMainWnd, WM_USER+255, 0, 0);  if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
{
switch(wParam)
{
    case 'C':  //按下C键
                {                
                    ::PostMessage(g_hMainWnd, WM_USER+255, 0, 0);
                }
                break;
            default:
                break;
        }
    }
    return CallNextHookEx( g_hHook, nCode, wParam, lParam );
}后来用spy++观察过用来测试的对话框窗口,在其不处于最前面的时候确实收不到WM_USER+255消息,这是为什么呢?