📄 main.pas
字号:
except
bmpstream.clear;
exit;
end;
if len <> 1024 then //已读完
begin
bmpstream.Position := 0;
drawstream.clear;
// wshtest1:=send_streamsize;
// wshtest2:=bmpstream.Size;
if send_streamsize = bmpstream.Size then
begin
drawstream.LoadFromStream(bmpstream);
drawstream.Position := 0;
// drawstream.SaveToFile('h:\draw.bmp');
// drawstream.Position := 0;
hua_ok := true; //可开始画屏幕
end;
bmpstream.Clear;
end;
end;
end;
procedure TForm1.WSocketHookDataAvailable(Sender: TObject; Error: Word);
var
s_leng, x_leng, y_leng, l_command: integer;
key_char, w_x, w_y, w_state, s_command: string;
begin
s_command := WSOCKEThook.ReceiveStr;
l_command := length(s_command);
if trim(s_command) = '紧急照会' then
begin
Panel1.Caption := '正在登陆...';
//发送登陆消息
loginwsocket.Close;
LoginwSocket.Multicast := true;
loginwSocket.Proto := 'udp';
LoginwSocket.Addr := '225.1.2.8'; // or whatever you decide
loginwSocket.Port := '1525';
loginwSocket.Connect;
end;
if l_command > 12 then
begin
s_leng := pos('state:=', s_command);
x_leng := pos('x:=', s_command);
y_leng := pos('y:=', s_command);
w_state := copy(s_command, 8, x_leng - s_leng - 7);
w_x := copy(s_command, x_leng + 3, y_leng - x_leng - 3);
w_y := copy(s_command, y_leng + 3, length(s_command) - y_leng - 2);
case strtoint(trim(w_state)) of
160:
setcursorpos(strtoint(trim(w_x)), strtoint(trim(w_y)));
// mouse_event(MOUSEEVENTF_LEFTUP,strtoint(trim(w_x)),strtoint(trim(w_y)),0,0);
161:
if guangbo_state <> '屏幕广播' then
mouse_event(MOUSEEVENTF_LEFTDOWN, strtoint(trim(w_x)), strtoint(trim(w_y)), 0, 0);
512:
setcursorpos(strtoint(trim(w_x)), strtoint(trim(w_y)));
//mouse_event(MOUSEEVENTF_MOVE,strtoint(trim(w_x)),strtoint(trim(w_y)),0,0);
513:
if guangbo_state <> '屏幕广播' then
mouse_event(MOUSEEVENTF_LEFTDOWN, strtoint(trim(w_x)), strtoint(trim(w_y)), 0, 0);
514:
if guangbo_state <> '屏幕广播' then
mouse_event(MOUSEEVENTF_LEFTUP, strtoint(trim(w_x)), strtoint(trim(w_y)), 0, 0);
515:
if guangbo_state <> '屏幕广播' then
mouse_event(MOUSEEVENTF_LEFTDOWN, strtoint(trim(w_x)), strtoint(trim(w_y)), 0, 0);
516:
if guangbo_state <> '屏幕广播' then
mouse_event(MOUSEEVENTF_RIGHTDOWN, strtoint(trim(w_x)), strtoint(trim(w_y)), 0, 0);
517:
if guangbo_state <> '屏幕广播' then
mouse_event(MOUSEEVENTF_RIGHTUP, strtoint(trim(w_x)), strtoint(trim(w_y)), 0, 0);
end;
end
else //否则为键盘HOOK
begin
if copy(s_command, 1, 4) = 'down' then
begin
key_char := copy(s_command, 7, l_command - 6);
if strtoint(key_char) = 666 then //如果为SHIFTUP键
begin
keybd_event(16, 0, KEYEVENTF_KEYUP, 0);
exit;
end;
keybd_event(strtoint(key_char), 0, 0, 0); //按下此键
//不是ALT,SHIFT,CTL键时,KEYUP
if (strtoint(key_char) < 16) or (strtoint(key_char) > 18) then
keybd_event(strtoint(key_char), 0, KEYEVENTF_KEYUP, 0);
end
else
begin
key_char := copy(s_command, 5, l_command - 4); //得到字符
keybd_event(strtoint(key_char), 0, KEYEVENTF_KEYUP, 0);
end;
if strtoint(key_char) = 27 then //如果为ESC键,释放ALT,CTL,SHIFT
begin
keybd_event(16, 0, KEYEVENTF_KEYUP, 0);
keybd_event(17, 0, KEYEVENTF_KEYUP, 0);
keybd_event(18, 0, KEYEVENTF_KEYUP, 0);
end;
end;
end;
procedure TForm1.IPX1ReceiveData(Sender: TObject; Buffer: PChar;
BufferLength: Integer; SockAddr: TSockAddrIPX; SockAddrLen: Integer);
var
recbuf: array[0..1023] of char;
rec: string;
i: smallint;
begin
if bufferlength <= 6 then exit;
recbuf := #0;
for i := 0 to bufferlength - 1 do
begin
recbuf[i] := buffer[i];
end;
try
bmpstream.WriteBuffer(recbuf, bufferlength);
except
bmpstream.clear;
exit;
end;
if bufferlength <> 1024 then //已读完
begin
bmpstream.Position := 0;
drawstream.clear;
if send_streamsize = bmpstream.Size then
begin
drawstream.LoadFromStream(bmpstream);
drawstream.Position := 0;
hua_ok := true; //可开始画屏幕
end;
bmpstream.Clear;
end;
end;
procedure TForm1.LoginTimerTimer(Sender: TObject);
begin
LMDTrayIcon1.Active := true;
if Panel1.Caption = '登陆成功!' then
begin
LoginTimer.Enabled := false;
loginwsocket.Close;
end
else
begin
try
loginwsocket.SendStr('/*csh*/:' + #13 + #10 + '我要登陆' + trim(localiplist.Strings[0]) +
'wshwzh' + s_computername);
except
LoginTimer.Enabled := false;
loginwsocket.Close;
showmessage('网络不通!');
end;
end;
end;
procedure TForm1.IPX2ReceiveData(Sender: TObject; Buffer: PChar;
BufferLength: Integer; SockAddr: TSockAddrIPX; SockAddrLen: Integer);
var
w_x, w_y, s_command: string;
x_leng, y_leng, i, myxor, imagesize: integer;
begin
s_command := '';
for i := 0 to BufferLength - 1 do
s_command := s_command + string(buffer[i]);
if bufferlength > 12 then
begin
x_leng := pos('x:=', s_command);
y_leng := pos('y:=', s_command);
w_x := copy(s_command, x_leng + 3, y_leng - x_leng - 3);
w_y := copy(s_command, y_leng + 3, length(s_command) - y_leng - 2);
setcursorpos(strtoint(trim(w_x)), strtoint(trim(w_y)));
end
else
begin
try
myxor := pos('xor', s_command);
if myxor > 0 then
begin imagesize := strtoint(copy(s_command, 1, length(s_command) - 3));
quan_screen := false;
end
else
begin
imagesize := strtoint(s_command);
quan_screen := true;
end;
except
send_streamsize := 0;
imagesize := 0;
end;
send_streamsize := imagesize;
s_command := '';
end;
end;
procedure TForm1.SoundIN1Data(data: Pointer; size: Integer);
var
fa_ci, fa_yu, i: smallint;
buf1: array[0..1023] of char;
begin
sendwav.WriteBuffer(data^, size);
sendwav.Position := 0;
fa_ci := sendwav.Size div 1024;
fa_yu := sendwav.Size mod 1024;
for i := 1 to fa_ci do
begin
sleep(1);
sendwav.ReadBuffer(buf1, 1024);
SVoiceSocket.Send(@buf1, 1024);
end;
if fa_yu > 0 then
begin
sleep(1);
sendwav.ReadBuffer(buf1, fa_yu);
SVoiceSocket.Send(@buf1, fa_yu);
end;
sendwav.Clear;
end;
procedure TForm1.RVoiceSocketDataAvailable(Sender: TObject; Error: Word);
var
voice_recbuf: array[0..1023] of char;
len: integer;
begin
voice_recbuf := #0;
len := RVoiceSocket.Receive(@voice_recbuf, 1024);
if len > 0 then begin
voice_wsh.WriteBuffer(voice_recbuf, len);
if len <> 1024 then
begin
try
voice_wsh.Position := 0;
SoundOut1.PlayBack(voice_wsh.Memory, voice_wsh.Size);
voice_wsh.Clear;
voice_wsh.Position := 0;
except
voice_wsh.Clear;
voice_wsh.Position := 0;
end;
end;
end;
end;
procedure TForm1.PingmuTimerTimer(Sender: TObject);
var
i, fa_ci, fa_yu, cursorx, cursory: integer;
dc: hdc;
wshcan: Tcanvas;
R: TRect;
compressstream: Tmemorystream;
mylzh: Tlzrw1;
buf1: array[0..1023] of char;
DrawPos: TPoint;
MyCursor: TIcon;
hld: hwnd;
Threadld: dword;
mp: tpoint;
pIconInfo: TIconInfo;
maskbitmap, colorbitmap: Tbitmap;
steamsize: integer;
cshjpeg: tjpegimage;
streamsize: string;
begin
cshjpeg:=tjpegimage.Create ;
bmpmap1 := Tbitmap.Create; //建立BMPMAP
wshcan := TCanvas.Create; //屏幕截取
dc := GetWindowDC(0);
try
wshcan.Handle := dc;
// R := Rect(0, 0, screen.Width, screen.Height);
R := Rect(0, 0, screen.Width, screen.Height);
bmpmap1.Width := R.Right;
bmpmap1.Height := R.Bottom;
if bmpmap1.Canvas.TryLock then
bmpmap1.Canvas.CopyRect(R, wshcan, R)
else
begin
releaseDC(0, DC);
bmpmap1.canvas.Unlock;
//wshcan.Unlock;
wshcan.Handle := 0;
wshcan.Free;
bmpmap1.FreeImage;
bmpmap1.Free;
bmpmap1 := nil;
// PingmuTimer.Enabled := true;
exit;
end;
finally
releaseDC(0, DC);
bmpmap1.canvas.Unlock;
end;
wshcan.Handle := 0;
wshcan.Free;
//画上鼠标图象
GetCursorPos(DrawPos);
//DrawPos := Point(CursorPos.x - HotSpot.x, CursorPos.y - HotSpot.y);
MyCursor := TIcon.Create;
// GetCursorIcon(MyCursor);子程序
getcursorpos(mp);
hld := WindowFromPoint(mp);
Threadld := GetWindowThreadProcessId(hld, nil);
AttachThreadInput(GetCurrentThreadId, Threadld, True);
MyCursor.Handle := Getcursor();
AttachThreadInput(GetCurrentThreadId, threadld, False);
GetIconInfo(Mycursor.Handle, pIconInfo);
cursorx := DrawPos.x - round(pIconInfo.xHotspot);
cursory := DrawPos.y - round(pIconInfo.yHotspot);
bmpmap1.Canvas.Draw(cursorx, cursory, MyCursor); //画上鼠标
//释放数组内存
MaskBitmap := TBitmap.Create;
ColorBitmap := TBitmap.Create;
MaskBitmap.Handle := piconinfo.hbmMask;
ColorBitmap.Handle := piconinfo.hbmColor;
MaskBitmap.FreeImage;
ColorBitmap.FreeImage;
MaskBitmap.free;
ColorBItmap.free;
Mycursor.ReleaseHandle;
MyCursor.Free; //释放鼠标指针
//建立需要发送的屏幕流
ScreenStream := TMemoryStream.Create;
Screenstream.Clear;
screenstream.Position := 0;
compressstream := Tmemorystream.Create; //建立压缩流
compressstream.Clear;
// 现在的屏幕保存如流,应该建立一个黑色流,以后发送XOR后的图象
// bmpmap1.SaveToFile('tong.bmp');
//bmpmap1.SaveToStream(compressstream); //发送XOR流
bmpmap1.PixelFormat :=pf8bit;
cshjpeg.Assign(bmpmap1);
cshjpeg.SaveToStream(compressstream);
bmpmap1.FreeImage;
bmpmap1.Free;
cshjpeg.Free;
bmpmap1 := nil;
cshjpeg:=nil;
compressstream.Position := 0;
// case compress_mode of
with vclzip1 do //压缩流用ZIP
begin
packlevel := 1;
ArchiveStream := TMemoryStream.Create;
archivestream.Position := 0;
ZipFromStream(compressstream, 'screen.jpg');
archivestream.Position := 0;
screenstream.LoadFromStream(archivestream);
archivestream.Free;
archivestream := nil;
end;
// end;
// LmdHiTImer2timer(sender);
compressstream.Clear;
compressstream.Free;
screenstream.Position := 0; //发送图象的大小,防止出错!
streamsize := inttostr(screenstream.Size);
// memo1.Lines.Add(inttostr(screenstream.size));
if quan_screen then
wsocketsize.SendStr(streamsize)
else wsocketsize.SendStr(streamsize + 'xor');
//如果屏幕相同发送满屏
if shang_size = screenstream.size then
begin
shang_ci := shang_ci + 1;
if shang_ci = 2 then //发送全部屏幕
begin
shang_ci := 0;
quan_screen := true;
screenstream.Clear;
screenstream.free;
screenstream := nil; //发送一帧屏幕完成!
// PingmuTimer.Enabled := true;
exit;
end;
end;
//发送图象
steamsize := screenstream.Size;
shang_size := steamsize;
if (steamsize > 130000) and (quan_screen = false) then
begin
quan_screen := true;
screenstream.Clear;
screenstream.free;
screenstream := nil; //发送一帧屏幕完成!
// PingmuTimer.Enabled := true;
exit;
end;
allsize := allsize + steamsize;
buf1 := #0;
fa_ci := steamsize div 1024;
fa_yu := steamsize mod 1024;
// if fa_yu = 0 then wsh_test := wsh_test + 1;
f
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -