我把HOOK放在了DLL中,想在HOOK到数据时PostThreadMessage给调用进程。可是没反应。DLL代码:
DWORD dwThreadID = 0; //它是全局变量
...
//Install hook
HHOOK InstallHook( DWORD dwID )
{
dwThreadID = dwID; g_hHook = SetWindowsHookEx( WH_GETMESSAGE, KeyboardProc, g_hInstance, 0 );
return g_hHook;
}//Record function
LRESULT CALLBACK KeyboardProc( int nCode, WPARAM wParam, LPARAM lParam )
{ if ( nCode < 0 )
return CallNextHookEx( g_hHook, nCode, wParam, lParam ); //if action
if ( HC_ACTION == nCode )
{
MSG *pMsg = (MSG *)lParam;
if ( WM_IME_COMPOSITION == pMsg->message )
{
if ( pMsg->lParam & GCS_RESULTSTR )
{ PostThreadMessage( dwThreadID, WM_CHARMSG, 0, 0 ); //不能断点,所以我也不知道有没有成功
}
} } return CallNextHookEx( g_hHook, nCode, wParam, lParam );
}EXE代码:
void CTestDlg::OnBnClickedStart()
{
PeekMessage( &msg, NULL, WM_USER, WM_USER + 1000, PM_NOREMOVE ); InstallHook( GetCurrentThreadId() ); while ( ::GetMessage( &msg, NULL, WM_USER, WM_USER + 1000 ) )
{
switch(msg.message)
{
case WM_CHARMSG:
AfxMessageBox( "收到" );
break;
} }}
DWORD dwThreadID = 0; //它是全局变量
...
//Install hook
HHOOK InstallHook( DWORD dwID )
{
dwThreadID = dwID; g_hHook = SetWindowsHookEx( WH_GETMESSAGE, KeyboardProc, g_hInstance, 0 );
return g_hHook;
}//Record function
LRESULT CALLBACK KeyboardProc( int nCode, WPARAM wParam, LPARAM lParam )
{ if ( nCode < 0 )
return CallNextHookEx( g_hHook, nCode, wParam, lParam ); //if action
if ( HC_ACTION == nCode )
{
MSG *pMsg = (MSG *)lParam;
if ( WM_IME_COMPOSITION == pMsg->message )
{
if ( pMsg->lParam & GCS_RESULTSTR )
{ PostThreadMessage( dwThreadID, WM_CHARMSG, 0, 0 ); //不能断点,所以我也不知道有没有成功
}
} } return CallNextHookEx( g_hHook, nCode, wParam, lParam );
}EXE代码:
void CTestDlg::OnBnClickedStart()
{
PeekMessage( &msg, NULL, WM_USER, WM_USER + 1000, PM_NOREMOVE ); InstallHook( GetCurrentThreadId() ); while ( ::GetMessage( &msg, NULL, WM_USER, WM_USER + 1000 ) )
{
switch(msg.message)
{
case WM_CHARMSG:
AfxMessageBox( "收到" );
break;
} }}
解决方案 »
- 如何写XML文件
- 怎样让滚动条永远可见 无须滚动时呈Disable状态
- 上海微创招我去北京微软作测试工程师 这个工作怎么样啊 还有面试应该注意什么啊
- socket问题,请帮帮小弟!急
- 请问怎么在CFormView自带的Dialog中添加CPropertySheet?
- 用OnClick得到treectrl的点击checkbox消息响应,可是得到的却是点击前的状态,请问怎样才能得到点击后的状态??
- 郁闷 …… 哪里有COM的例子?尽可能简单的例子。
- SQL_COPT_SS_PRESERVE_CURSORS宏为什么找不到
- 如何释放资源?
- 在vc中如何来调用matlab中的文件(*.m)完成一些操作??
- 关于多显示器中,获取某个显示器图像的问题
- CreateFile打开文件新问题?
或者将g_hInstance替换为NULL试一下(对全部应用程序进行勾子)?
不太懂,标记一下。
有了::GetMessage( &msg, NULL, WM_USER, WM_USER + 1000 )就行了
GetMessage第3个和第4个参数直接传NULL;
下面加个
MessageBox(NULL,"postmsg","",MB_OK);//试试代码到这没有
DLL可以被调试吧?怎么会跟踪不到?
而且我感觉,截取键盘消息还是用DirInput的好用,貌似可以全局监视键盘,以前我做的DNF一键召唤就是用的DirInput,HOOK没用- -!
而且按照微软的说法,这个函数应该放在while循环里面,反复发送知道发成功了为止。