我使用键盘钩子的,目的是发现用户按下某个按键的时候 替换成另外的一个按键
问题是:发送按键消息过去的时候,目标程序能接收,但问题是,消息好像进入死循环一样,比如我的目的是按下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 就替换成按下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;
}
解决方案 »
- 请问strip chart activex control怎么用
- DLL库问题
- 为什么连接本机在公网的ip,有时可以,有时又连不上?
- 调用多语言资源DLL之后,CFormView::Create()里,_AfxCheckDialogTemplate输出Cannot find dialog template with IDD 0x00AB.
- 无效的描述器索引
- 请大家加入csdn qq群号码:11238513 ,程序员的家
- 请问有没有哪位大哥知道如何通过软件的方式实现回间消除?
- 关于视频与位图的问题,绝对是高手级问题
- 我在以*.wdl结尾的文件时非常的劳累,有没有什么可以朗读他的什么软件啊,我想听可能比看要好一点
- 自绘窗体问题
- 请问按钮的鼠标消息怎么放到对话框的OnLButtonDown中处理?
- 模态窗口中执行时,MainFrame的显示问题
改成return CallNextHookEx( hkb, nCode, wParam, lParam );
lParam 改成你替换的虚拟键
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));
}
// ::PostMessage(hChild,WM_KEYUP,'E',MapVirtualKey('E',0));这句就什么反映也没有