2012-11-19 229 views
1

我正在使用CreateProcess API將RealVNC與我的exe文件集成...我只需要爲創建的vnc客戶端處理句柄,但目前爲止我還是不成功。該代碼非常簡單:在標題VARCreateProcess並獲取句柄

procedure TForm1.VncAuth; 
var 
    StartInfo: TStartupInfo; 
    ProcInfo: TProcessInformation; 
    CmdLine: string; 
    title: string; 
    ProcHandle: THandle; 
begin 
    FillChar(StartInfo,SizeOf(TStartupInfo),#0); 
    FillChar(ProcInfo,SizeOf(TProcessInformation),#0); 
    StartInfo.cb := SizeOf(TStartupInfo); 
    CmdLine:= 'vnc.exe'; 
    UniqueString(CmdLine); 
    CreateProcess(NIL ,PChar(CmdLine), NIL, NIL, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS 
            , NIL, NIL, StartInfo, ProcInfo); 
    ProcHandle:= ProcInfo.hProcess; 
    GetWindowText(ProcHandle, PChar(title), 255); 
    ShowMessage(title); 
end; 

不返回任何結果......在GetWindowText函數的功能只是一個測試,看看我是否有合適的手柄,如果是的,我應該可以看到VNC客戶端標題的吧? 謝謝!

+2

'ProcInfo.hProcess'是**進程**句柄。 'GetWindowText'需要一個**窗口**句柄。它們根本不是同一個東西,不僅僅是一個門把手就是一個刀柄。 –

+0

和一些快速解決方案?? – user1526124

回答

5

窗口句柄和進程句柄不是一回事。對於GetWindowText,您需要一個窗口句柄。

  1. 創建進程調用WaitForInputIdle後允許進程啓動並創建其主窗口。
  2. 致電EnumWindows列舉頂層窗口。
  3. 對於每個頂層窗口,請致電GetWindowThreadProcessId以找出創建該窗口的進程的進程ID。您創建的進程的進程ID是ProcInfo.dwProcessId
  4. 當您找到一個進程ID與您剛剛創建的進程匹配的窗口時,該窗口就是您的人!
+1

您可能需要包含類名稱或可視性等。對第4步進行測試時,許多進程會創建多個頂級窗口。 –