2012-11-19 87 views
0

我正在做一個通過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驗證。所以我搜索窗口內的編輯併發送我的密碼。問題是:這個窗口有兩個編輯,一個用戶(禁用)和一個用於傳遞(這是我的焦點),但我只能寫我的傳球進入用戶的編輯。如何獲得正確編輯的句柄?他們在同一個窗口,並從同一類「編輯」...下面的屏幕截圖發生了什麼: enter image description here

+0

很可能您的Real VNC客戶端不是Delphi應用程序,並且該對話框基於資源。然後,您可以在頂級窗口上使用GetDlgItem('VNC Viewer - Authentication')。 –

+0

..如果不這樣做,你可以用ES_PASSWORD風格區分編輯,否則,你可以比較兩個編輯的屏幕位置.. –

回答

2

你正在使它遠比它需要更難。 RealVNC已經配備了一些功能,可以讓您在無需互動的情況下進行連接。您只需創建一個包含必要選項的文本文件,並在啓動時將其傳遞給RealVNC查看器程序。

文本文件可能是這樣的:

 
[Connection] 
Host=myhost.com::666 
Encryption=AlwaysOn 
Username=domain\user 
Password=******** 
[Options] 
.... 

你可以得到RealVNC公司通過打開的連接,(與F8 IE)造就了RealVNC的菜單,然後選擇保存爲您創造的文件連接。這將保存包含該連接的所有設置的.vnc文件。只需將該.vnc文件在啓動時傳遞給查看器程序,這一切都很好。

所有你需要的,因此做的是:

  1. 創建.vnc連接文件。
  2. 將命令行更改爲'vnc.exe connection.vnc'
  3. 刪除撥打CreateProcess後的所有代碼。
  4. 致電CloseHandleCreateProcess返回的兩個句柄。

爲了你的需求,我建議在調用ShellExecute可能比CreateProcess容易。

+0

是的,我明白了你的觀點......我可以這樣工作,但我需要知道密碼在.vnc文件中的散列是如何創建的...所以我可以自動爲新密碼創建.vnc文件。你有沒有在德爾福的任何參考,它是如何產生的? – user1526124

+0

我不知道。你可以看看VNC的來源。或者發送電子郵件給RealVNC人員。我沒有想到你也想要生成密碼。 –

+0

是的,事實上我並沒有在尋找這個,但有了你的解決方案,我需要它......無論如何是一個聰明的解決方案。我會做一些研究,並在這裏發帖... – user1526124