📄 client.~pas
字号:
unit client;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ScktComp, ComCtrls,MMSystem;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
cls: TClientSocket;
sb: TStatusBar;
procedure Button1Click(Sender: TObject);
procedure clsError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure clsConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure clsConnecting(Sender: TObject; Socket: TCustomWinSocket);
procedure clsRead(Sender: TObject; Socket: TCustomWinSocket);
procedure FormClose(Sender: TObject; var Action: TCloseAction);//自定义截屏函数
Procedure getinfo(info:string);
procedure clsDisconnect(Sender: TObject; Socket: TCustomWinSocket);
function GetOSVersion:integer;//得到操作系统类型
procedure set2000xp; //对于2000及xp系统关机前要作权限查询
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure Tform1.set2000xp;
var
hToken:THandle;
tkp : TOKEN_PRIVILEGES;
ReturnLength : DWord;
begin
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_ALL_ACCESS or TOKEN_QUERY, hToken);
LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid);
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes :=SE_PRIVILEGE_ENABLED;
ReturnLength :=0;
AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil,ReturnLength);
end;
function Tform1.GetOSVersion:integer;
Var
osVerInfo : TOSVersionInfo;
begin
osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
If (GetVersionEx(osVerInfo)) Then
begin
case ( osVerInfo.dwPlatformId ) Of
VER_PLATFORM_WIN32_NT : { Windows NT/2000 }
begin
result:=1;//win2k 或 winxp
end;
VER_PLATFORM_WIN32_WINDOWS : { Windows 9x/ME }
begin
result:=0;//win95--98--98se--me
end
else
result:=0;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if edit1.text='' then
begin
application.MessageBox('服务器地址还没有指定!','系统提醒',mb_iconwarning+mb_ok);
edit1.SetFocus;
exit;
end;
if edit2.text='' then
begin
application.MessageBox('服务器开放本服务的端口还没有指定!','系统提醒',mb_iconwarning+mb_ok);
edit2.SetFocus;
exit;
end;
cls.Address:=edit1.text;
cls.Port:=strtoint(edit2.text);
if button1.Caption='连接' then
begin
try
if cls.Active then cls.Active:=false;//连接前先关闭
cls.Active:=true;
sb.Panels[0].Text:='正在连接到'+edit1.text+'服务器!';
finally
edit1.Enabled:=false;
edit2.Enabled:=false;
button1.Caption:='断开';
end;
end
else
begin
try
cls.Active:=false;
sb.Panels[0].Text:='正在断开与服务器的连接...';
finally
edit1.Enabled:=true;
edit2.Enabled:=true;
sb.Panels[0].Text:='已经断开与服务器的连接!';
button1.Caption:='连接';
end;
end;
end;
procedure TForm1.clsError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
var
errorstr:string;
begin
if ErrorEvent=eeSend then
errorstr:='发送数据出现错误'
else
if ErrorEvent=eeConnect then
begin
errorstr:='连接失败,无法连接到指定服务器';
button1.Caption:='连接';
end
else
if ErrorEvent=eeDisconnect then
begin
errorstr:='断开连接失败,暂时无法与服务器断开连接';
button1.Caption:='断开';
end
else
if ErrorEvent=eeReceive then
errorstr:='接收数据出现错误'
else
if ErrorEvent=eeAccept then
errorstr:='出现错误,与服务建立的连接没有完成'
else
errorstr:='出现未知错误,请检查网络是否正常';
sb.Panels[0].Text:=errorstr;
errorcode:=0; //返回无错,让系统不再有提示
end;
procedure TForm1.clsConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
sb.Panels[0].Text:='成功连接到'+edit1.text+'服务器!';
end;
procedure TForm1.clsConnecting(Sender: TObject; Socket: TCustomWinSocket);
begin
sb.Panels[0].Text:='正在连接'+edit1.text+'服务器';
end;
procedure TForm1.clsRead(Sender: TObject; Socket: TCustomWinSocket);
var
ostr,sbstr:string;
cmd:integer;
rect:TRect; //定义一个矩形区域
hDesktop:THandle; //一个窗口句柄
begin
ostr:=socket.ReceiveText;
if length(ostr)=2 then //普通命令
begin
cmd:=strtoint(ostr);
case cmd of
11 :
begin
sbstr:='弹开CD-ROM仓门';
mcisendstring('set cdaudio door open',nil,0,0);
end;
10 :
begin
sbstr:='关闭CD-ROM仓门';
mcisendstring('set cdaudio door closed',nil,0,0);
end;
21 :
begin
rect.Left:=screen.Width div 2;rect.right:=screen.Width div 2;
rect.top:=screen.height div 2;rect.bottom:=screen.height div 2;
ClipCursor(@rect); {将鼠标锁定在屏幕中央}
sbstr:='鼠标已经被管理员锁定';
end;
20 :
begin
sbstr:='管理员已经解开对鼠标的锁定';
rect.Left:=0;rect.right:=screen.Width;
rect.top:=0;rect.bottom:=screen.height;
ClipCursor(@rect); {恢复鼠标活动范围}
end;
31 :
begin
sbstr:='系统暂被管理员锁定';
hDesktop:= FindWindow('Progman', nil);//获取桌面窗口句柄
ShowWindow(hDesktop, SW_HIDE);{隐藏桌面}
hDesktop:= FindWindow('Shell_TrayWnd', nil);//获取任务栏句柄
ShowWindow(hDesktop, SW_HIDE);{隐藏任务栏}
end;
30 :
begin
sbstr:='管理员已经将系统解锁';
hDesktop:= FindWindow('Progman', nil);//获取桌面窗口句柄
ShowWindow(hDesktop, SW_SHOW);{隐藏桌面}
hDesktop:= FindWindow('Shell_TrayWnd', nil);//获取任务栏句柄
ShowWindow(hDesktop, SW_SHOW);{隐藏任务栏}
end;
41 :
begin
sbstr:='管理员准备将本系统重新启动';
if getosversion=1 then
set2000xp;
ExitWindowsEx(EWX_REBOOT,2)//重新启动计算机
end;
40 :
begin
sbstr:='管理员准备将本系统关闭';
if getosversion=1 then
set2000xp;
ExitWindowsEx(EWX_SHUTDOWN,8)//关闭计算机
end;
end;//end of case
end
else //发送的文字信息
begin
sbstr:='管理员发来文字信息';
getinfo(ostr);
end;
sb.Panels[1].Text:=sbstr;//在状态栏显示服务器发来的例子令解释
end;
Procedure Tform1.getinfo(info:string);
var
str:string;
ch:char;
prom:integer;//显示窗口类型
begin
str:=info;
ch:=str[1];
delete(str,1,1);//去掉前面对话框标志,只留下文本信息
if str='shutdown' then
begin
cls.Active:=false;
button1.Caption:='连接';
end
else
begin
case ch of
's','S' :
prom:=mb_iconstop;
'w','W' :
prom:=mb_iconwarning;
'q','Q' :
prom:=mb_iconquestion;
else
prom:=mb_iconinformation;
end;
application.MessageBox(pchar(str),'系统信息',prom+mb_ok);
exit;
end;
// close;//关闭窗口
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if cls.Active then
application.MessageBox('请先断开与服务器的连接后再关闭本程序','系统提醒',mb_iconstop+mb_ok);
end;
procedure TForm1.clsDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
sb.Panels[0].Text:='已经断开与服务器的连接!';
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -