BSOne.SFC/Tocsg.Module/RemoteSecu/EXE_RemoteSecuClient/DRdpLink.pas

173 lines
4.3 KiB
Plaintext

unit DRdpLink;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, RSecuClient, Vcl.ExtCtrls;
const
WM_RESP_RD_CONNECT = WM_USER + 5938;
type
TDlgRdpLink = class(TForm)
lbMsg: TLabel;
btnOpenMstsc: TButton;
btnCopyCB: TButton;
tMstscAuto: TTimer;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btnOpenMstscClick(Sender: TObject);
procedure btnCopyCBClick(Sender: TObject);
procedure tMstscAutoTimer(Sender: TObject);
private
{ Private declarations }
Client_: TRSecuClient;
sRqIp_: String;
nRdpPort_: Integer;
llToss_: LONGLONG;
procedure RequestRdpConnect;
public
{ Public declarations }
Constructor Create(aOwner: TComponent; aClient: TRSecuClient; sRqIp: String);
procedure process_WM_SYSCOMMAND(var msg: TWMSysCommand); Message WM_SYSCOMMAND;
procedure process_WM_RESP_RD_CONNECT(var msg: TMessage); Message WM_RESP_RD_CONNECT;
end;
var
DlgRdpLink: TDlgRdpLink;
implementation
uses
GlobalSocketDefine, Tocsg.Packet, Tocsg.Exception, Vcl.Clipbrd, Tocsg.Safe,
Tocsg.Shell, Tocsg.WndUtil, Tocsg.Keyboard;
{$R *.dfm}
Constructor TDlgRdpLink.Create(aOwner: TComponent; aClient: TRSecuClient; sRqIp: String);
begin
Inherited Create(aOwner);
llToss_ := 0;
Client_ := aClient;
sRqIp_ := sRqIp;
Caption := Format('%s에 RDP 연결', [sRqIp_]);
lbMsg.Caption := Format('%s에 RDP 연결을 요청합니다...', [sRqIp_]);
RequestRdpConnect;
end;
procedure TDlgRdpLink.RequestRdpConnect;
var
Send: ISendPacket;
begin
Send := TTgPacket.Create(RS_REQ_RDP_CONNECT);
Send.Handle := Handle;
Send.WndMessage := WM_RESP_RD_CONNECT;
Send.S['IP'] := sRqIp_;
Client_.SendPacket(Send);
end;
procedure TDlgRdpLink.tMstscAutoTimer(Sender: TObject);
var
h, hEdit, hBtn: HWND;
sBtnCap: String;
begin
h := FindWindow('#32770', '원격 데스크톱 연결');
if h <> 0 then
begin
tMstscAuto.Enabled := false;
hEdit := GetWndChildClass(h, 'Edit');
if hEdit <> 0 then
begin
SetEditText(hEdit, Format('%s:%d', [sRqIp_, nRdpPort_]));
PressKeys(#13);
// hBtn := GetWndChildClass(h, 'Button');
// while hBtn <> 0 do
// begin
// sBtnCap := GetWindowCaption(hBtn);
// if Pos('연결', sBtnCap) > 0 then
// begin
// if SetForegroundWindow(hBtn) then
// PressKeys(#13);
// break;
// end;
// hBtn := GetWndChildClass(h, 'Button', hBtn);
// end;
end;
end;
end;
procedure TDlgRdpLink.btnCopyCBClick(Sender: TObject);
var
CB: TClipboard;
begin
Guard(CB, TClipboard.Create);
CB.AsText := Format('%s:%d', [sRqIp_, nRdpPort_]);
MessageBox(Handle, PChar('접속 정보가 클립보드에 복사되었습니다.'), PChar(Caption), MB_ICONINFORMATION or MB_OK);
end;
procedure TDlgRdpLink.btnOpenMstscClick(Sender: TObject);
begin
ExecutePath('mstsc.exe');
tMstscAuto.Enabled := true;
end;
procedure TDlgRdpLink.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
procedure TDlgRdpLink.process_WM_SYSCOMMAND(var msg: TWMSysCommand);
var
Send: ISendPacket;
begin
if (llToss_ <> 0) and (msg.CmdType = SC_CLOSE) then
begin
MessageBox(Handle, PChar('RDP 연결이 종료됩니다.'+#13+#10+'계속 하시겠습니까?'),
PChar(Caption), MB_ICONQUESTION or MB_YESNO);
Send := TTgPacket.Create(RS_REQ_RDP_CLOSE);
Send.Toss := llToss_;
Client_.SendPacket(Send);
Close;
end;
Inherited;
end;
procedure TDlgRdpLink.process_WM_RESP_RD_CONNECT(var msg: TMessage);
var
Rcv: IRcvPacket;
nPort: Integer;
begin
try
Rcv := IRcvPacket(msg.LParam);
if Rcv.Result <> 0 then
begin
MessageBox(Handle, PChar(Rcv.ResultMsg), PChar(Caption), MB_ICONWARNING or MB_OK);
exit;
end;
nPort := Rcv.I['Port'];
if nPort = 0 then
begin
lbMsg.Caption := 'RDP 연결 요청을 실패했습니다...';
exit;
end;
nRdpPort_ := nPort;
llToss_ := Rcv.Toss;
lbMsg.Caption := 'RDP 연결 대기중입니다.' + #13#10 + Format('%s:%d', [sRqIp_, nPort]);
btnOpenMstsc.Enabled := true;
btnCopyCB.Enabled := true;
Application.ProcessMessages;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. process_WM_RESP_RD_CONNECT()');
end;
end;
end.