最近在学习钩子, 自己写了一个全局键盘钩子,想做成改建的效果. 下面是简单的代码
//全局变量
HINSTANCE hInstance = NULL ;
HHOOK     hHook     = NULL ;//入口函数
BOOL WINAPI DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH: break ;        case DLL_THREAD_ATTACH:  break ;                            //线程和进程开始时        case DLL_THREAD_DETACH:  break ;        case DLL_PROCESS_DETACH: 
if( hHook != NULL )
UnhookWindowsHookEx( hHook ) ;
break ;                                                 //线程和进程结束时
}
 
hInstance = (HINSTANCE)hModule ; return TRUE ;
}
//拦截键盘消息的回调函数
LRESULT CALLBACK GetKeyboardMsg(int nCode, WPARAM wParam, LPARAM lParam)
{
char Show_Char = NULL ;
if(((DWORD)lParam&0x40000000)&&(HC_ACTION==nCode) )
//MessageBox(NULL, "截获击键消息了!", NULL, MB_OK) ;
switch( wParam )
{
case '1':
keybd_event(81,0,0,0) ;
keybd_event(81,0,KEYEVENTF_KEYUP,0) ;
break ;
}
LRESULT ReGetFun = CallNextHookEx(hHook,   nCode,   wParam,   lParam   ) ;
return ReGetFun ;}
//安装钩子函数
EXPORT BOOL InstallHook()
{
hHook      = SetWindowsHookEx( WH_KEYBOARD, (HOOKPROC)GetKeyboardMsg,  hInstance, 0) ; if( hHook == NULL )
{
MessageBox(NULL, "钩子安装失败", "HookDll", MB_OK) ;
return FALSE ;
}

return TRUE ;
}我想把1建改成Q建的效果,自己再写了个程序调用,可以达到效果,可是问题是,每次输出Q之前都会再输出1一次,好像是消息并没有截杀,只是拦截,拦截后消息还是继续运行。
请问要怎么做,才能拦截消息改成自己想要的结果后,不让原本的消息继续进行,而让自己改成的消息进行就好?

解决方案 »

  1.   

    WH_KEYBOARD钩子只是获得通知,不能修改按键.
      

  2.   

    用SendInput模拟要改成的按键,然后返回非0值中断原来的
      

  3.   

    LRESULT CALLBACK LowLevelKeyboardProc(
    int nCode,
    WPARAM wParam,
    LPARAM lParam
    )
    {
    if(((PKBDLLHOOKSTRUCT)lParam)->vkCode=='Z')
    {
    INPUT Input[1];
    Input[0].type=INPUT_KEYBOARD;
    Input[0].ki.wVk='C';
    Input[0].ki.dwFlags=((PKBDLLHOOKSTRUCT)lParam)->flags&LLKHF_UP?KEYEVENTF_KEYUP:0;
    Input[0].ki.wScan=MapVirtualKeyExW('C',0,0);
    Input[0].ki.time=0;
    Input[0].ki.dwExtraInfo=0;
    SendInput(1,Input,sizeof(INPUT));
    return 1;
    }
    return CallNextHookEx(0,nCode,wParam,lParam);
    }int wmain()
    {
    MSG msg;
    SetWindowsHookExW(WH_KEYBOARD_LL,LowLevelKeyboardProc,GetModuleHandleW(0),0);
    while(GetMessageW(&msg,0,0,0))DispatchMessageW(&msg);
    return 0;
    }