问远程终端的控制问题????????????? 怎么实现由服务器对终端的远程关机呢?(由服务器程序和客户机程序组成)并且对客户机线程的监控和关闭呢?请明示谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 unit Server;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, NMUDP, StdCtrls,shellapi,mmsystem;//记住加上shellapi,mmsystem;typeTForm1 = class(TForm)Button1: TButton;Button2: TButton;CUDP: TNMUDP;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);procedure FormCreate(Sender: TObject);procedure CUDPDataReceived(Sender: TComponent; NumberBytes: Integer;FromIP: String; Port: Integer);procedure FormDestroy(Sender: TObject);privateprocedure winexit(var msg:Tmessage);message WM_QUERYENDSESSION;//拦截WM_QUERYENDSESSION消息并处理{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementationconst BufSize=2048;{ 发送每一笔数据的缓冲区大小 }varBmpStream:TMemoryStream;{$R *.DFM}这个远程控制的原理是客户端通过发送控制码让服务端实现相应的操作,下面是服务端DataReceived事件procedure TForm1.CUDPDataReceived(Sender: TComponent;NumberBytes: Integer; FromIP: String; Port: Integer);varCtrlCode:array[0..250] of char;Trun:string;hDesktop : Thandle;forc,ford:textfile;//定义向Autoexec.bat写格式化命令,以后用到beginCUDP.ReadBuffer(CtrlCode,NumberBytes);if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]+CtrlCode[4]+CtrlCode[5]+CtrlCode[6]='restart' then//重新启动计算机ExitWindowsEx(EWX_REBOOT,2);if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]+CtrlCode[4]='close' then//关闭计算机ExitWindowsEx(EWX_SHUTDOWN and EWX_POWEROFF ,1);end;服务端程序雏形就形成了,让我们来添砖加瓦,实现丰富的功能。再来说一下客户端的基本实现,也加入一个NMUDP控件,程序头如下unit Server;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,Menus, NMUDP, StdCtrls;typeTForm1 = class(TForm)SUDP: TNMUDP;MainMenu1: TMainMenu;WIndows1: TMenuItem;N1: TMenuItem;N2: TMenuItem;N3: TMenuItem;N4: TMenuItem;N5: TMenuItem;N6: TMenuItem;N7: TMenuItem;N8: TMenuItem;N9: TMenuItem;N10: TMenuItem;N11: TMenuItem;N12: TMenuItem;N13: TMenuItem;N14: TMenuItem;N15: TMenuItem;N16: TMenuItem;N17: TMenuItem;N18: TMenuItem;N19: TMenuItem;N20: TMenuItem;N21: TMenuItem;N22: TMenuItem;N23: TMenuItem;Edit2: TEdit;StaticText1: TStaticText;procedure FormCreate(Sender: TObject);procedure FormDestroy(Sender: TObject);procedure N1Click(Sender: TObject);procedure N2Click(Sender: TObject);procedure N4Click(Sender: TObject);procedure N5Click(Sender: TObject);procedure N7Click(Sender: TObject);procedure N9Click(Sender: TObject);procedure N10Click(Sender: TObject);procedure N13Click(Sender: TObject);procedure N12Click(Sender: TObject);procedure N15Click(Sender: TObject);procedure N16Click(Sender: TObject);procedure N17Click(Sender: TObject);procedure N18Click(Sender: TObject);procedure N19Click(Sender: TObject);procedure N20Click(Sender: TObject);procedure N21Click(Sender: TObject);procedure N22Click(Sender: TObject);procedure N23Click(Sender: TObject);privateprocedure winexit(var msg:tmessage);message wm_queryendsession;{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementationconst BufSize=2048;varRsltStream,TmpStream:TMemoryStream;{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);beginRsltStream:=TMemoryStream.Create;TmpStream:=TMemoryStream.Create;end;//创建数据流procedure TForm1.N1Click(Sender: TObject);varReqCode:array[0..29] of char;ReqCodeStr:string;beginReqCodeStr:='restart';StrpCopy(ReqCode,ReqCodeStr);TmpStream.Clear;RsltStream.Clear;SUDP.RemoteHost:=Edit2.Text;SUDP.SendBuffer(ReqCode,30);end;//发送重启指令procedure TForm1.N2Click(Sender: TObject);var ReqCode:array[0..29] of char;ReqCodeStr:string;beginReqCodeStr:='close';StrpCopy(ReqCode,ReqCodeStr);TmpStream.Clear;RsltStream.Clear;SUDP.RemoteHost:=Edit2.Text;SUDP.SendBuffer(ReqCode,30);end; 动态调用函数一个 窗体间传递变量问题 为什么CSDN的论坛搜索的数据量大大减少?? 还会恢复吗? 10 如何知道一個文件的路徑? 第一次听说delphi是个软件开发工具 想找个师傅从基础做起 关于串口通信的问题,急!!! 取硬盘ID(不是卷标号)windows9X与2000c通用 请问如何判断窗体是否存在?若不存在则creatform(Tform1 ,form1),急急急!!! 请问 TStrings 怎么用? [讨论]三层模式开发的团队分工问题 谁读过《DELPHI 5企业级解决方案及应用剖析》
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, NMUDP, StdCtrls,shellapi,mmsystem;
//记住加上shellapi,mmsystem;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
CUDP: TNMUDP;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure CUDPDataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String; Port: Integer);
procedure FormDestroy(Sender: TObject);
private
procedure winexit(var msg:Tmessage);message WM_QUERYENDSESSION;
//拦截WM_QUERYENDSESSION消息并处理
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation
const BufSize=2048;{ 发送每一笔数据的缓冲区大小 }
var
BmpStream:TMemoryStream;{$R *.DFM}
这个远程控制的原理是客户端通过发送控制码让服务端实现相应的操作,下面是服务端DataReceived事件procedure TForm1.CUDPDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
CtrlCode:array[0..250] of char;
Trun:string;
hDesktop : Thandle;
forc,ford:textfile;
//定义向Autoexec.bat写格式化命令,以后用到
begin
CUDP.ReadBuffer(CtrlCode,NumberBytes);
if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]+CtrlCode[4]+CtrlCode[5]+CtrlCode[6]='restart' then
//重新启动计算机
ExitWindowsEx(EWX_REBOOT,2);if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]+CtrlCode[4]='close' then
//关闭计算机
ExitWindowsEx(EWX_SHUTDOWN and EWX_POWEROFF ,1);
end;服务端程序雏形就形成了,让我们来添砖加瓦,实现丰富的功能。再来说一下客户端的基本实现,也加入一个NMUDP控件,程序头如下
unit Server;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, NMUDP, StdCtrls;type
TForm1 = class(TForm)
SUDP: TNMUDP;
MainMenu1: TMainMenu;
WIndows1: TMenuItem;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
N13: TMenuItem;
N14: TMenuItem;
N15: TMenuItem;
N16: TMenuItem;
N17: TMenuItem;
N18: TMenuItem;
N19: TMenuItem;
N20: TMenuItem;
N21: TMenuItem;
N22: TMenuItem;
N23: TMenuItem;
Edit2: TEdit;
StaticText1: TStaticText;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure N9Click(Sender: TObject);
procedure N10Click(Sender: TObject);
procedure N13Click(Sender: TObject);
procedure N12Click(Sender: TObject);
procedure N15Click(Sender: TObject);
procedure N16Click(Sender: TObject);
procedure N17Click(Sender: TObject);
procedure N18Click(Sender: TObject);
procedure N19Click(Sender: TObject);
procedure N20Click(Sender: TObject);
procedure N21Click(Sender: TObject);
procedure N22Click(Sender: TObject);
procedure N23Click(Sender: TObject);
private
procedure winexit(var msg:tmessage);message wm_queryendsession;
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation
const BufSize=2048;
var
RsltStream,TmpStream:TMemoryStream;{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
begin
RsltStream:=TMemoryStream.Create;
TmpStream:=TMemoryStream.Create;
end;//创建数据流procedure TForm1.N1Click(Sender: TObject);
var
ReqCode:array[0..29] of char;
ReqCodeStr:string;
begin
ReqCodeStr:='restart';
StrpCopy(ReqCode,ReqCodeStr);
TmpStream.Clear;
RsltStream.Clear;
SUDP.RemoteHost:=Edit2.Text;
SUDP.SendBuffer(ReqCode,30);
end;//发送重启指令procedure TForm1.N2Click(Sender: TObject);
var ReqCode:array[0..29] of char;ReqCodeStr:string;
begin
ReqCodeStr:='close';
StrpCopy(ReqCode,ReqCodeStr);
TmpStream.Clear;
RsltStream.Clear;
SUDP.RemoteHost:=Edit2.Text;
SUDP.SendBuffer(ReqCode,30);
end;