系统关闭(100分)

  • 主题发起人 主题发起人 txbdir
  • 开始时间 开始时间
T

txbdir

Unregistered / Unconfirmed
GUEST, unregistred user!
请问一下,如何当一个程序运行时,而不能强制关闭计算机!
而下面的代码不行呢?

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose :=False;
end;
 
Application.Terminate
 
我觉得还是去捕获计算机关闭的消息.....
 
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose :=False;
end;
这个就可以了!
TO: 暗夜中独舞 FormCloseQuery 就是去捕获计算机关闭的消息 看看VCL 原码就知道
 
不行啊!这个我试过的,不行的!
 
怎么不行啊! 还能关闭计算机吗! 除非断电啊
 
有一种方式你是没办法的,就是对方强制关机,不等待各系统返回是否关机消息。
 
同意 暗夜中独舞,
搜搜以前的帖子
 
我没有找得有啊!
 
wolf_cyj,这种情况如何不能让电脑关闭呢?
 
给你个提示,网上抄得,这个问题也的确遇到过,在你程序中改写窗口过程,让他忽略掉WM_ENDSESSION事件,这样就无法关机了。比如你设置个全局变量MyCanClose,然后在FormClose事件中设置MyCanClose:= true,然后在窗口过程得WM_ENDSESSION事件分支中不断检测这变量就可以了:
WM_ENDSESSION:
if MyCanClose then
TWMEndSession(Message).EndSession;
==================================
FastNet里面NMUDP造成无法关机
原因:
TNMXXX控件有BUG。所有nm控件的基础 PowerSocket用到的ThreadTimer,用到一个隐藏
的窗口(类为TmrWindowClass)处理有硬伤。
出问题的地方:
Psock::TThreadTimer::WndProc(var msg:TMessage)
if msg.message=WM_TIMER then
他自己处理
msg.result:=0
else
msg.result:=DefWindowProc(0,....)
end
问题就出在调用 DefWindowProc时,传输的HWND参数居然是常数0,这样实际上
DefWindowProc是不能工作的,对任何输入的消息的调用均返回0,包括
WM_QUERYENDSESSION,所以不能退出windows。由于DefWindowProc的不正常调用,实际
上除WM_TIMER,其他消息由DefWindowProc处理都是无效的。
解决的办法是在 PSock.pas
在 TThreadTimer.Wndproc 内
Result := DefWindowProc( 0, Msg, WPARAM, LPARAM );
改为:
Result := DefWindowProc( FWindowHandle, Msg, WPARAM, LPARAM );
 
有没有例子啊?如果能帮我做一个例子,本人十分感谢!
 
对方程序如果调用强行关机的选项,貌似你是没有办法的,直接关机。
比如windows关机,有时候系统会说有些程序没有关闭,问你怎么办,这就是因为没有收到某程序同意关闭的消息。接下来你可以选择直接关闭,就是忽略掉它的同意关闭消息。
编程时如果调用关机API的时候设置强行关机选项,就是直接忽略掉所有程序的同意关闭消息。
 
我建議你在程式啟動的時候把那些關機的鍵給屏障掉。這樣就關不了機了,除非直接關電源。。。。
 
关机是这样一个过程:
1、给所有程序发送WM_QUERYENDSESSION消息,等待反馈。
2、如果WM_QUERYENDSESSION返回允许关闭,那么接着给窗口发送WM_ENDSESSION消息来关闭窗口。Form的CloseQuery事件被调用,如果同意关闭(CanClose=true)则调用FormClose事件关闭它,不同意关闭则无法关闭。这个时候Windows任务管理器也许弹出个强行结束程序的对话框,同时出来个进度条,超时则强行关闭。
所以我觉得应该截获WM_QUERYENDSESSION消息,不理会它就可以防止关机。
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
WantClose: boolean;
procedure WndProc(var Message: TMessage); override;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }



{ TForm1 }

procedure TForm1.WndProc(var Message: TMessage);
begin
case Message.Msg of
WM_QUERYENDSESSION:
if not WantClose then
exit;
end;
inherited;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
WantClose:= true;
end;

end.
 
谢谢!等一下给你分!
 
顶! 都是大侠。
 
不好意思,不行啊!好像还没有我说的那种管用呢?
 
后退
顶部