功能就像一般的改键工具一样,比如在按下"A"键时实现"B"键的功能。
我尝试用钩子来获得了按下的键值,然后用keybd_event来实现替换键的功能:
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
{ if (wParam== '1')
{
keybd_event('2',   0,   0,   0);keybd_event('2',   0,   KEYEVENTF_KEYUP,   0);
}
         }  LRESULT RetVal = CallNextHookEx( hkb, nCode, wParam, lParam );
return  RetVal;
}
但是运行时我发现在按下“1”键的时候,输出的是"12",我想知道怎么屏蔽掉原键的消息。如果直接return TRUE 的话就会屏蔽掉所有按键。

解决方案 »

  1.   

    试一试截获按键消息之后,不再向下传递,然后自己发送KeyDown消息,并把附加参数设定为键盘码
      

  2.   

    不知道这样行不行?
    LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam) 

      if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode)) 
      {     if (wParam== '1') 
        { 
          keybd_event('2',  0,  0,  0);
          keybd_event('2',  0,  KEYEVENTF_KEYUP,  0);
          return TRUE;
        } 
      }   LRESULT RetVal = CallNextHookEx( hkb, nCode, wParam, lParam ); 
      return  RetVal; 

      

  3.   

    说的是sendMessage吗,似乎还是没用。楼上的方法依然会输出‘12’来!
      

  4.   

    这样试试:
    LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
        if (nCode >= 0 && wParam == '1')
        {
            DWORD flags = 0;
            if ((DWORD)lParam & 0x80000000))
                flags = KEYEVENTF_KEYUP;
            keybd_event('2', 0, flags, 0);
            return TRUE;
        } 
        return CallNextHookEx(hkb, nCode, wParam, lParam);
    }
      

  5.   

    你发送完毕就直接return TRUE,打断消息链,继续传递的话当然是2个键咯
      

  6.   

    还是不行,如果直接return TRUE 的话,就不会输出2了。
      

  7.   

    恩,很感谢cnzdgs 的帮助,确实可以达到效果。
    能告诉我原因吗?再次感谢!