在线求助,跨进程拦截WM_SETFOCUS消息

Goodreams 2011-11-08 04:08:55
直接上代码吧
LRESULT CALLBACK KeyProc ( int code, WPARAM wParam, LPARAM lParam)
{
MSG *lpMsg;
lpMsg = (MSG*)lParam;
if(lpMsg->message==WM_SETFOCUS)
{
::MessageBox(NULL,"拦截到消息","",MB_OK);
}

return CallNextHookEx (gkeyhook,code,wParam,lParam);
}

void __stdcall SetHidehook ( DWORD threadID)
{
gkeyhook = ::SetWindowsHookEx ( WH_GETMESSAGE,(HOOKPROC) KeyProc, ::GetModuleHandle ("xxx.dll"), threadID) ;
}


void __stdcall UnHidehook (HWND ahwnd)
{
UnhookWindowsHookEx (gkeyhook) ;
}

现在测试到,把if(lpMsg->message==WM_SETFOCUS)条件去掉,可以MessageBox弹出。加上条件就弹不出了,求助解决!!
先在此谢过。
...全文
393 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
LandSnow 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
用WH_CBT类型的钩子,注意回调函数必须在dll中实现
当nCode == HCBT_SETFOCUS 并返回1 拦截 窗口获取WM_SETFOCUS
[/Quote]
非常感谢啊,前几天遇到一个子类化抢断消息的问题,试了很多方法都不能很好的解决,最终东找西找还是决定使用钩子来解决.这个解决了我卡了三天的问题.... 刚刚点到7楼去了...
LandSnow 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

SetWindowsHookEx
[/Quote]
非常感谢啊,前几天遇到一个子类化抢断消息的问题,试了很多方法都不能很好的解决,最终东找西找还是决定使用钩子来解决.这个解决了我卡了三天的问题....
Goodreams 2011-11-08
  • 打赏
  • 举报
回复
if (code==HCBT_SETFOCUS && ::GetWindowThreadProcessId((HWND)wParam,NULL) == ::GetCurrentThreadId() )
{return 1;}

我测试了这样,还是一样不能行到焦点,但会失去焦点
Goodreams 2011-11-08
  • 打赏
  • 举报
回复
wParam != 目标窗口句柄

这个目标窗口句柄,因为是跨进程DLL是注入过去的。参数传递不过去。
gameslq 2011-11-08
  • 打赏
  • 举报
回复
>>先感谢大牛的指导,你的代码我测试了一下,实现了目标窗口,不能得到焦点。但我想让目标一直保持焦点,不失去,怎么弄呢?
相反,wParam != 目标窗口句柄 就是返回1,使目标窗口不失去焦点
gameslq 2011-11-08
  • 打赏
  • 举报
回复
>>gameslq,请问怎么设置条件,能锁定目标线程的焦点?

if ( code < 0 )
return CallNextHookEx(g_InstallHook,code,wParam,lParam);

if ( code == HCBT_SETFOCUS && GetWindowThreadProcessId(wParam,NULL) == 目标线程id )
return 1;


return CallNextHookEx(g_InstallHook,code,wParam,lParam);

Goodreams 2011-11-08
  • 打赏
  • 举报
回复
if ( code == HCBT_SETFOCUS && wParam == 目标窗口句柄 )
return 1;


先感谢大牛的指导,你的代码我测试了一下,实现了目标窗口,不能得到焦点。但我想让目标一直保持焦点,不失去,怎么弄呢?
gameslq 2011-11-08
  • 打赏
  • 举报
回复

if ( code < 0 )
return CallNextHookEx(g_InstallHook,code,wParam,lParam);

if ( code == HCBT_SETFOCUS && wParam == 目标窗口句柄 )
return 1;


return CallNextHookEx(g_InstallHook,code,wParam,lParam);
Goodreams 2011-11-08
  • 打赏
  • 举报
回复
code = HCBT_SETFOCUS
wParam参数是 Specifies the handle to the window gaining the keyboard focus.
lParam参数是 Specifies the handle to the window losing the keyboard focus.

gameslq,请问怎么设置条件,能锁定目标线程的焦点?
Goodreams 2011-11-08
  • 打赏
  • 举报
回复

if (code==HCBT_SETFOCUS)
{
if ( WM_SETFOCUS 这里的条件怎么写呢? )
{ }
else
{return CallNextHookEx (gkeyhook,code,wParam,lParam);}

}
紫色动力 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gameslq 的回复:]

用WH_CBT类型的钩子,注意回调函数必须在dll中实现
当nCode == HCBT_SETFOCUS 并返回1 拦截 窗口获取WM_SETFOCUS
[/Quote]
请问:你是怎么学习的?我怎么看了半天API,还是看不懂呢?
我现在在看《Windows程序设计》。唉
Goodreams 2011-11-08
  • 打赏
  • 举报
回复
并返回1,是指什么返回的呀?
gameslq 2011-11-08
  • 打赏
  • 举报
回复
用WH_CBT类型的钩子,注意回调函数必须在dll中实现
当nCode == HCBT_SETFOCUS 并返回1 拦截 窗口获取WM_SETFOCUS
chunyou128 2011-11-08
  • 打赏
  • 举报
回复
SetWindowsHookEx
Goodreams 2011-11-08
  • 打赏
  • 举报
回复
The CallWndProc hook procedure can examine the message, but it cannot modify it. After the hook procedure returns control to the system, the message is passed to the window procedure.

MSDN上这样说明的,只能查检消息,不能修改,那就是说不能拦截吧。怎么才能拦下来呀?请高手们帮个忙呀
Goodreams 2011-11-08
  • 打赏
  • 举报
回复
LRESULT CALLBACK KeyProc ( int code, WPARAM wParam, LPARAM lParam)
{
CWPSTRUCT *lpMsg;
lpMsg = (CWPSTRUCT*)lParam;

if(lpMsg->message == WM_SETFOCUS)
{::MessageBox(NULL,"222","111",MB_OK);}
else
{return CallNextHookEx (gkeyhook,code,wParam,lParam);}
}

嗯,改成我WH_CALLWNDPROC的后,拦截函数如上。现在问题是确实是执行了MessageBox这里,但为什么,目标进程,还是能得到焦点。没有达到拦截的目的。看看我的代码问题出在哪了?


yuucyf 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 goodreams 的回复:]
我主要是想拦截WM_SETFOCUS,刚刚看资料,感觉应该用WH_CBT
[/Quote]
可以呀,你的代码只改一个地方就行了呀,把WH_GETMESSAGE改成WH_CALLWNDPROC就可以了.
Goodreams 2011-11-08
  • 打赏
  • 举报
回复
我主要是想拦截WM_SETFOCUS,刚刚看资料,感觉应该用WH_CBT
yuucyf 2011-11-08
  • 打赏
  • 举报
回复
WH_GETMESSAGE Hook只拦截由GetMessage or PostMessage的消息,不能拦截由SendMessage引起的消息。
the WH_GETMESSAGE hook enables an application to monitor messages about to be returned by the GetMessage or PeekMessage function. You can use the WH_GETMESSAGE hook to monitor mouse and keyboard input and other messages posted to the message queue.

要Hook SendMessage必须Hook WH_CALLWNDPROC and WH_CALLWNDPROCRET Hooks
gkeyhook = ::SetWindowsHookEx (WH_CALLWNDPROC, ...) ;

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧