173 lines
4.3 KiB
Plaintext
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.
|