如何HOOK到WM_SYSCOMMAND,并且是SC_MINIMIZE

firsthym 2009-10-04 07:51:43
首先声明一点:是跨进程HOOK。

请问下GetMsgProc(int code,WPARAM wParam,LPARAM lParam)是哪个参数能够扑捉到 WM_SYSCOMMAND+SC_MINIMIZE ?
...全文
432 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
firsthym 2009-10-06
  • 打赏
  • 举报
回复
我测试也可以了,确实是需要条件pMsg->message== WM_NCLBUTTONDOWN&& pMsg->wParam==HTMINBUTTON
  • 打赏
  • 举报
回复
可以
firsthym 2009-10-06
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 zison_sun 的回复:]
C/C++ code
LRESULT CALLBACK GetMsgProc(int nCode,
WPARAM wParam,
LPARAM lParam
)
{if (nCode<0|| nCode== HC_NOREMOVE)return CallNextHookEx(hMsgHook,nCode,wParam,lParam);

PMSG pMsg= (PMSG) lParam;if(pMsg->message== WM_SYSCOMMAND&& pMsg->wParam== SC_MINIMIZE)
{
MessageBox(NULL,"GetMsg 截获","截获",0);
pMsg->message= NULL;
}elseif(pMsg->message== WM_NCLBUTTONDOWN&& pMsg->wParam==HTMINBUTTON)
{

MessageBox(NULL,"GetMsg 截获","截获",0);
pMsg->message= NULL;
}return CallNextHookEx(hMsgHook,nCode,wParam,lParam);
}
用SPY++ 看了好久,发现单击最小化按钮与单击菜单最小化发送消息是不同的。
[/Quote]
恩,我先试试。你试了能屏蔽不?
  • 打赏
  • 举报
回复


LRESULT CALLBACK GetMsgProc( int nCode,
WPARAM wParam,
LPARAM lParam
)
{
if (nCode < 0 || nCode == HC_NOREMOVE)
return CallNextHookEx(hMsgHook,nCode,wParam,lParam);

PMSG pMsg = (PMSG) lParam;

if(pMsg->message == WM_SYSCOMMAND && pMsg->wParam == SC_MINIMIZE)
{
MessageBox(NULL,"GetMsg 截获","截获",0);
pMsg->message = NULL;
}
else if(pMsg->message == WM_NCLBUTTONDOWN && pMsg->wParam ==HTMINBUTTON)
{

MessageBox(NULL,"GetMsg 截获","截获",0);
pMsg->message = NULL;
}
return CallNextHookEx(hMsgHook,nCode,wParam,lParam);
}


用SPY++ 看了好久,发现单击最小化按钮与单击菜单最小化发送消息是不同的。
  • 打赏
  • 举报
回复
这种方法只能屏蔽菜单上的最小化,不能屏蔽最小化按钮啊?
楼上可以?
MoXiaoRab 2009-10-05
  • 打赏
  • 举报
回复
原来楼主是要阻止消息传递啊,没看清楚

那就只能用WH_GETMESSAGE钩子了

MSG *Msg = (MSG*)lParam;

if(Msg->message == WM_SYSCOMMAND)
{
if(Msg->wParam == SC_MINIMIZE)
{
Msg.message = WM_NULL;
}
}
  • 打赏
  • 举报
回复
有些钩子只能查看消息,不能修改消息,也不能通过返回非0值阻止消息继续传递。很不幸,你用的WH_CALLWNDPROC就是其中之一。MSDN里说得很清楚:After the hook procedure returns control to the system, the message is passed to the window procedure.
WH_GETMESSAGE钩子可以修改消息,你试试看。
具体做法:

PMSG pMsg = (PMSG) lParam;

if(pMsg->message == WM_SYSCOMMAND && pMsg->wParam == SC_MINIMIZE)
{
MessageBox(NULL,"GetMsg 截获","截获",0);
pMsg->message = NULL; //改变消息
}
return CallNextHookEx(hMsgHook,code,wParam,lParam);
  • 打赏
  • 举报
回复
我试了下,你的方法只有使用菜单最小化才能弹出消息框,点及最小化按钮是没反映滴,而Troj4n的方法正好相反,不知道你的情况是不是和我一样?呵呵。
firsthym 2009-10-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 tr0j4n 的回复:]
你先用我的试试看行不行。WH_GETMESSAGE我没试过,不过应该可以也能截获到
[/Quote]
试了你的代码,还是不行。
其实我的问题很简单,比如屏蔽掉记事本程序的最小化消息,用VC做,怎么写呢?
MoXiaoRab 2009-10-05
  • 打赏
  • 举报
回复
你先用我的试试看行不行。WH_GETMESSAGE我没试过,不过应该可以也能截获到
firsthym 2009-10-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zison_sun 的回复:]
注意啊,楼主HOOK的是WH_GETMESSAGE, GetMsgProc 的lParam是MSG指针,而Troj4n HOOK 的是WH_CALLWNDPROC,GetMsgProc 的lParam是CWPSTRUCT指针,两者是不同的。


[/Quote]
正是,我查了下,CWPSTRUCT是HOOK的WH_CALLWNDPROC,我现在只想HOOk系统最小化消息并处理,应该HOOK什么呢?然后HOOKPROC函数该怎么写呢?我写的不对吗?但是就是没有MessageBox出来。有人能解决吗?
  • 打赏
  • 举报
回复
注意啊,楼主HOOK的是WH_GETMESSAGE, GetMsgProc 的lParam是MSG指针,而Troj4n HOOK 的是WH_CALLWNDPROC,GetMsgProc 的lParam是CWPSTRUCT指针,两者是不同的。

MoXiaoRab 2009-10-05
  • 打赏
  • 举报
回复
5#代码CWPSTRUCT改成CWPSTRUCT*
MoXiaoRab 2009-10-05
  • 打赏
  • 举报
回复
建议你去看MSDN上的《Using Hooks》,下WH_CBT是监视不到消息的
firsthym 2009-10-05
  • 打赏
  • 举报
回复
另外,请问下是安装什么钩子呢?我最开始安装的是WH_GETMESSAGE,后来安装WH_CBT,但是WH_CBT钩子勾住后,我的目标进程就会崩溃,这是为什么呢?
firsthym 2009-10-05
  • 打赏
  • 举报
回复
还有我的代码有什么问题呢?
firsthym 2009-10-05
  • 打赏
  • 举报
回复
--------------------Configuration: HookDll - Win32 Debug--------------------
Compiling...
HookDll.cpp
D:\developer\projects\Test\HookDll\HookDll.cpp(31) : error C2440: 'type cast' : cannot convert from 'long' to 'struct tagCWPSTRUCT'
No constructor could take the source type, or constructor overload resolution was ambiguous
D:\developer\projects\Test\HookDll\HookDll.cpp(31) : error C2227: left of '->message' must point to class/struct/union
D:\developer\projects\Test\HookDll\HookDll.cpp(33) : error C2440: 'type cast' : cannot convert from 'long' to 'struct tagCWPSTRUCT'
No constructor could take the source type, or constructor overload resolution was ambiguous
D:\developer\projects\Test\HookDll\HookDll.cpp(33) : error C2227: left of '->wParam' must point to class/struct/union
Error executing cl.exe.

HookDll.dll - 4 error(s), 0 warning(s)
MoXiaoRab 2009-10-05
  • 打赏
  • 举报
回复

LRESULT WINAPI CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0 || nCode == HC_NOREMOVE)
return CallNextHookEx(g_hCallWndHook,nCode,wParam,lParam);

if (((CWPSTRUCT)lParam)->message==WM_SYSCOMMAND)
{
if (((CWPSTRUCT)lParam)->wParam==SC_MINIMIZE)
{
MessageBeep(0);
}

}
return CallNextHookEx(g_hCallWndHook,nCode,wParam,lParam);

}
firsthym 2009-10-05
  • 打赏
  • 举报
回复
我这样写,有什么错误吗?还是HOOK不到SC_MINIMIZE
LRESULT CALLBACK GetMsgProc(
int code,
WPARAM wParam,
LPARAM lParam)
{
/*if(SC_MINIMIZE==HIWORD(wParam))
{
::MessageBox(g_hWnd,"ÆË×½µ½SC_MINIMIZE!",NULL,0);
return 1;
}
else
return CallNextHookEx(g_hMsg,code,wParam,lParam);*/
//return 1;
PMSG pmsg=(PMSG)lParam;
if(WM_SYSCOMMAND==pmsg->message && pmsg->wParam==SC_MINIMIZE)
{
HWND hwnd=GetForegroundWindow();
::MessageBox(hwnd,"Catch SC_MINIMIZE",NULL,0);
return 1;
}
return CallNextHookEx(g_hMsg,code,wParam,lParam);
}
  • 打赏
  • 举报
回复
可以.
第三个参数lParam:Pointer to an MSG structure that contains details about the message.
加载更多回复(2)

16,473

社区成员

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

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

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