我正在做一個通過Real VNC客戶端進行自動登錄的項目。我有一個局域網,並且已經很多無聊的用這個客戶端在很多個程序上做這樣的程序。所以我決定自動化這個過程。我用我的程序(使用CreateProcess)打開VNC客戶端,並將IP作爲參數傳遞給連接。我現在的意圖是發送該機器的密碼並模擬[輸入],我堅持這一步。我會更好地解釋下面的代碼:與RealVNC客戶端集成
procedure TForm1.VncAuth;
var
StartInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CmdLine: string;
begin
FillChar(StartInfo,SizeOf(TStartupInfo),#0);
FillChar(ProcInfo,SizeOf(TProcessInformation),#0);
StartInfo.cb := SizeOf(TStartupInfo);
CmdLine:= 'vnc.exe 192.168.1.14';
UniqueString(CmdLine);
CreateProcess(NIL ,PChar(CmdLine), NIL, NIL, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS
, NIL, NIL, StartInfo, ProcInfo);
WaitForInputIdle(ProcInfo.hProcess, INFINITE);
Timer:= TTimer.Create(Nil);
Timer.Interval:= 5000;
Timer.OnTimer:= DoVNCAuth;
Timer.Enabled:= true;
end;
好吧,上面的程序打開vnc.exe並通過IP連接。所以我等了5秒鐘,有時間連接到IP和VNC要求輸入密碼,5秒後我去DoVNCAuth程序。這是這樣的:
procedure TForm1.DoVNCAuth(Sender: TObject);
var
pass: string;
begin
pass:= 'password';
VNCChild:= FindWindowEx(0, 0, Nil, 'VNC Viewer - Authentication');
if VNCChild > 0 then
begin
VNCHandle:= FindWindowEx(VNCChild, 0, 'Edit', 0);
SendMessage(VNCHandle, WM_SETTEXT, 0, Integer(PChar(pass)));
end;
end;
此程序,搜索窗口要求vnc驗證。所以我搜索窗口內的編輯併發送我的密碼。問題是:這個窗口有兩個編輯,一個用戶(禁用)和一個用於傳遞(這是我的焦點),但我只能寫我的傳球進入用戶的編輯。如何獲得正確編輯的句柄?他們在同一個窗口,並從同一類「編輯」...下面的屏幕截圖發生了什麼:
很可能您的Real VNC客戶端不是Delphi應用程序,並且該對話框基於資源。然後,您可以在頂級窗口上使用GetDlgItem('VNC Viewer - Authentication')。 –
..如果不這樣做,你可以用ES_PASSWORD風格區分編輯,否則,你可以比較兩個編輯的屏幕位置.. –