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.