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

  • 主题发起人 主题发起人 Crane
  • 开始时间 开始时间
C

Crane

Unregistered / Unconfirmed
GUEST, unregistred user!
我想获得一个程序的窗口句柄后,当鼠标点击该程序关闭按钮
时,该程序不关闭,而是最小化,提供全部解决方案者可获得
全部三百分。
我用wh_cbt怎么也不行,望高手相助。
 
小弟试了一把
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action:=caMinimize;
end;
不起作用???见笑了。
 
Haha
他要的可不一定是自己的form,而是其它窗口
 
Type
TForm1 = class(TForm)
private
WMSYSCOMMAND(var MSG: TWMSYSCOMAND); message WM_SysCommand;
end;

implementation

procedure TForm1.WMSYSCOMMAND(var MSG: TWMSYSCOMAND);
begin
if MSG.CmdType = SC_Close then
begin
ShowWindow(Self.Handle, SW_Hide); //hide current window
//ShowWindow(Application.Handle, Show_Hide); //hide the whole application
MSG.Result := 0;
end;
end;
 
截获 windows 的 wm_close 消息啊。
 
不可能吧,用HOOK都不行?肯定是你的程序有问题!!!
 
自己的程序可以,别人的不那么容易
 
如果是自己的程序还用花300来问? 多此一答.
我估计得为crane兄弟(姐妹?)默哀了.
最多你能得到看似接近的答案就是WH_CALLWNDPROC了,
不过根据文档显示, 对该HOOK用户只能看不能改.

过去我问过这种问题(有关如何修改通过SendMessage发送到指定窗口的消息),
他们就告诉我用WH_CALLWNDPROC然后修改, 当我说明文档记载不能修改时,
竟然还有人回答说用WH_CALLWNDPROC修改!!!
当我要求确认是否文档记载错误, 或者他们是否测试过后, 就没任何人理我的题目了.

因此, crane你就别抱什么希望啦
 
是我错了!

但还有替代的方法:)

使用HOOK截获此程序的mouse和key,看鼠标点的地方是否是关闭程序的地方
键盘是否按了ALT_F4

比较土,但应该还有好方法的
 
对了,可以用HOOK,就是WH_GETMESSAGE

请参考MSDN
 
这个我是做过的,例如:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if MessageDlg('Close application ?', mtConfirmation,
[mbYes, mbNo], 0) = mrYes then
Action := caFree
else
Action := caMinimize;
end;
 
对不起,刚才说错了,应该是:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if MessageDlg('Close application ?', mtConfirmation,
[mbYes, mbNo], 0) = mrYes then
Action := caFree
else
begin
Action := canone;
form1.WindowState:=wsminimized;
end;
end;
 
我想Crane指的应当是外部的应用程序.
这种就只能使用HOOK来做了,具体好象应该写GETMESSAGE或者SHELL钩子(记不请了).如果我
有时间的话,那么我会给你一个例子.
 
to Another_eYes :
正如你所说我是要控制其他程序的关闭。如能截获就好了,其实也用不着改变,只是
想让鼠标点击关闭按钮时,窗口最小化,你有办法吗,我用钩子钩一天了,什么也没
吊着。;(
 
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
canclose:=false;
tapplication.minimize;
end;
 
zign等人,你们都搞错了,我不是要控制关闭自己编写的程序,而是控制一个外部程序。
此问题我已经自行解决,用钩子,但不用wh_cbt wh_shell wh_callwinproc,解决的比较
土,希望能有更好的办法,等一个星期,过后如果没有,大家平分。
 
在WINDOWS编程中有一个经典的WIN_MESSAGE的例子,大体的概念是:
1.监视消息。
2.截获消息
3.分析消息
4.处理消息(吃掉消息或归还消息)
 
rax:别纯理论啊,我们要CODE,我们要CODE ---
 
那就用全局的WH_GETMESSAGE钩子吧.
判断Msg.Message是否为鼠标或者键盘消息. 如果是鼠标消息, 则根据相应的x, y计算
是否鼠标位于windows的close box上, 如果是的话, 就截取掉WM_LBUTTONDOWN,
WM_LBUTTONUP消息.
如果是键盘(Alt-F4)就没辙了. 因为它不是发的键盘消息, 它发送的是WM_SYSCOMMAND,
好象是用SendMessage发的.
 
呵呵,eyes,好像wh_getmessage可以直接hook wm_syscommand,能不能改我就不记得了,
不过wh_Getmessage钩子挺好用的,我用wh_getMessage截获了IME消息可以直接获得键盘
输入的中英文,用来偷别人的密码^_^
 

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
后退
顶部