2012-11-19 386 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步进行测试时,许多进程会创建多个顶级窗口。 –