如何阻止一个特定应用程序窗口的关闭(您有机会获得全部三百分)(300分)

  • 主题发起人 主题发起人 Crane
  • 开始时间 开始时间
不要平分,300都给我(不然我跟你急!) :-)
WH_CBT是可以用的,但必须要有精心的设计,利用各种消息综合判断,
才能实现目的,看看我这一刀吧:

//Hook DLL 中的关键部分

const
TARGET_WND_TITLE = 'Other Window's Title';
var
TargetWnd : HWND;
ghHook:HHOOK;

function MyCBTHookProc(nCode: Integer; wp: wParam; lp: lParam): LResult; stdcall;
const
TargetWindowFocused:Boolean=False;
begin
if (nCode=HCBT_ACTIVATE) then
begin
TargetWnd := FindWindow(nil, PChar( TARGET_WND_TITLE ));
TargetWindowFocused:=(wp=TargetWnd);
end;

result:=CallNextHookEx(ghHook{rHookRec^.HookID},nCode,wP,lP);

if (nCode=HCBT_SYSCOMMAND) and (wp=SC_CLOSE) and (TargetWindowFocused) then
begin
ShowWindow(TargetWnd, SW_SHOWMINIMIZED);
result:=1;
end;
end;

procedure SetHook;
begin
ghHook:= SetWindowsHookEx(WH_CBT, @MyCBTHookProc, hInstance, 0);
end;

...
 
eYes:你的方法和我现在的方法差不多。
温柔一刀:我试试去,不过先给你三刀,呵呵。
 
反对平分分数!
有太多的人是来混分的。(包括我,别让我得逞)
 
我记得以前看Bc的书,上面写着,一个窗口关闭时,先向消息队列发
Wm_XXXXXXX消息(抱歉我记不清了),然后消息队列再发给窗口一个
WM_XXXXXXX消息(抱歉我也记不清了;-) ),然后窗口PostMessage(WM_Quit)
才退出.
那我有个办法,用GetCursorPos,WindowFromPoint得到当前窗口,
再GetMessage/PeekMessage从消息队列中取消息,就是窗口给消息队列发的
那个,是的话,取走,再发一条最小化消息,不是,别取走...
我不知道行不行?
 
阿刀,你可真心急,我还没试呢,不过分数还是先给你吧,既然你那么有把握
应该错不了。
 
>>阿刀,你可真心急,我还没试呢

那是你的问题,你就给个回信,说你还没有试验就可以了嘛!
我之所以着急是因为我试验成功,但是遇到一些小问题,
希望看看别人的结果(如果有其他人试验了,也请回应一下,谢谢)

>>既然你那么有把握应该错不了

反正我试验的时候对于一般的窗口是成功的,对于一些特定类型的窗口,
如:Netscape,explorer等等,似乎没有收到相应的HCBT消息(Close),
他们似乎是自己有Hook,进行特殊处理,不知道是否确实如此。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部