我使用键盘钩子的,目的是发现用户按下某个按键的时候 替换成另外的一个按键
问题是:发送按键消息过去的时候,目标程序能接收,但问题是,消息好像进入死循环一样,比如我的目的是按下1 就替换成按下A的消息发过去,但目标程序会不断的相应A的按键 好像我按下就没松开过一样.
我无论用发消息给窗口 还是用keyXX函数,还是用SendInput 结果都一样
代码如下:
LRESULT __declspec(dllexport)__stdcall  CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
// return   CallNextHookEx( hkb, nCode, wParam, lParam );
if( nCode<0)   
{
return   CallNextHookEx( hkb, nCode, wParam, lParam );
    } LRESULT RetVal=-1;
 c_key=NULL;
 
if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
 {
char KeyName[50];
ZeroMemory(KeyName,50);
GetKeyNameText(lParam,KeyName,50);
CString KeyNameStr=KeyName;
if( KeyNameStr=="1")
{
c_key='E';
goto here;
}
if( KeyNameStr=="2")
{
c_key='R';
goto here;
}
if( KeyNameStr=="3")
{
c_key='W';
goto here;
}
if( KeyNameStr=="4")
{
c_key='D';
goto here;
}
if( KeyNameStr=="5")
{
c_key='F';
goto here;
}
if( KeyNameStr=="6")
{
c_key='S';
goto here;
}
if( KeyNameStr=="7")
{
c_key='A';
goto here;
}
if(KeyNameStr=="-")
{
c_key=VK_ESCAPE;
goto here;
}
if(KeyNameStr=="=")
{
c_key=VK_RETURN;
goto here;
}
 }
 
//send analog signals
if(  c_key==NULL)
{   return CallNextHookEx( hkb, nCode, wParam, lParam );
}
else

here:
 tc_key = c_key;
       //  AfxBeginThread(CHodllApp::OnProcessThread,&tc_key, THREAD_PRIORITY_NORMAL);
   HWND m_hide=NULL;
    m_hide=::FindWindow("TForm_show" ,"XXX");
HWND hChild=::FindWindowEx(m_hide,NULL,"TEdit","XXX");    if( m_hide==NULL||hChild==NULL)
   {
   AfxMessageBox("can't find the window");
   }
 //  ::FindWindowEx(
       ::PostMessage(hChild,WM_KEYDOWN,'E',MapVirtualKey('E',0));
   Sleep(20);
       ::PostMessage(hChild,WM_KEYUP,'E',MapVirtualKey('E',0));
   RetVal =1;
}
   
return RetVal;
}

解决方案 »

  1.   

    你思路错误,你根本没必要再去模拟输入了,只要传给下一层钩子就行了,否则你这样模拟输入的,钩子又钩到你的模拟键了,那样就永远反复执行了!你钩到一个按键,然后你又模拟一个按键,然后你的钩子又钩到你模拟的这个按键,又模拟,就这么反复了!所以你没必要去模拟,你就把lParam改了,传给下一层就可以了
      

  2.   

    return RetVal;
    改成return   CallNextHookEx( hkb, nCode, wParam, lParam );
    lParam 改成你替换的虚拟键
      

  3.   

    用不着这么复杂吧,直接把nCode替换掉就行了。
      

  4.   

    lParam  修改了没用 我试过了
      

  5.   

    我帮你看看,我以前是用detous做的
      

  6.   

    HWND m_hide=NULL;
        m_hide=::FindWindow("TForm_show" ,"XXX");
    HWND hChild=::FindWindowEx(m_hide,NULL,"TEdit","XXXX");    if( m_hide==NULL||hChild==NULL)
       {
       AfxMessageBox("can't find the window");
       }
     //  ::FindWindowEx(
       while(1)
       {
        Sleep(2000);
           ::PostMessage(hChild,WM_KEYDOWN,'E',MapVirtualKey('E',0));
      // Sleep(20);
        //   ::PostMessage(hChild,WM_KEYUP,'E',MapVirtualKey('E',0));
       }
      

  7.   

    我在其他程序 不用hook 怎么结果是一样的?如果不去掉 
     //   ::PostMessage(hChild,WM_KEYUP,'E',MapVirtualKey('E',0));这句就什么反映也没有
      

  8.   

    jacklzw88(不可爱咯)说的那个原理我觉得是正确的啊.也许是你代码哪里搞错了.不防整理一下思路再写写~~