如何用钩子屏蔽别的程序的最小化消息?急``顶着送分(300分)

  • 主题发起人 主题发起人 mincom
  • 开始时间 开始时间
M

mincom

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何屏蔽别人程序的最小化消息,已下代码可以拦截到calc.exe程序点击最小化
的消息,但是我想把此消息屏蔽掉,也就是说点击标题栏的最小化按钮后,对方的程序
没有任何反应(不执行最小化的功能),请问以下的代码该如何改进?
注意:我要屏蔽的是别人的程序最小化消息,而不是自己的程序。(calc.exe是系统自带的计算器)
function CallWndProc(nCode: Integer;
wParam: WPARAM;
lParam: LPARAM): LRESULT;
stdcall;
begin
if nCode = HC_ACTION then
begin
//点击标题栏的最小化按钮后,拦截到以下消息
if PCWPStruct(lParam)^.message = wm_syscommand then
if PCWPStruct(lParam)^.wParam = sc_minimize then
//拦截到最小化消息了
if pos('calc.exe', paramstr(0)) <> 0 then
//确认此消息来自calc.exe进程
begin
PCWPStruct(lParam)^.lParam := WM_NULL;
//屏蔽掉该消息
MessageBeep(64);
//可以听到声音,但是程序依然被最小化了
end;
end;
Result := CallNextHookEx(WndProcHook, nCode, wParam, lParam);
end;

procedure HookOn();
begin
WndProcHook := SetWindowsHookEx(WH_CALLWNDPROC, @CallWndProc, HInstance, 0);
end;

procedure HookOff();
begin
UnHookWindowsHookEx(WndProcHook);
end;
 
应该还要接管返回值吧
 
CallWndHook好像是不能修改消息的,但是GETMESSAGE Hook可以,我也遇上了这个问题,正打算用API Hook把DefWindowProc给Hook掉来解决这个问题,不知道还有没有更好的办法
 
但是用 WH_GETMESSAGE 拦截不到 sc_minimize 消息啊
 
可以用窗口子类化实现这个功能
 
subclass 别的进程的 wndproc 啊
 
帮你顶一下,学习学习:)
 
要事先知道进程存在不同的服务程序,这就要实进搜索进程。
然后再接合系统信息机制就可以了。
 
修改如下试试:
function CallWndProc(nCode: Integer;
wParam: WPARAM;
lParam: LPARAM): LRESULT;
stdcall;
begin
if nCode = HC_ACTION then
begin
//点击标题栏的最小化按钮后,拦截到以下消息
if PCWPStruct(lParam)^.message = wm_syscommand then
if PCWPStruct(lParam)^.wParam = sc_minimize then
//拦截到最小化消息了
if pos('calc.exe', paramstr(0)) <> 0 then
//确认此消息来自calc.exe进程
begin
//PCWPStruct(lParam)^.lParam := WM_NULL;
//屏蔽掉该消息
MessageBeep(64);
//可以听到声音,但是程序依然被最小化了
Exit;
//不执行CallNextHookEx
end;
end;
Result := CallNextHookEx(WndProcHook, nCode, wParam, lParam);
end;
 
多人接受答案了。
 
后退
顶部