【问题标题】:CreateProcess and get the handleCreateProcess 并获取句柄
【发布时间】:2012-11-19 13:34:49
【问题描述】:

我正在使用 CreateProcess API 将 RealVNC 与我的 exe 集成...我只需要为创建的 vnc 客户端处理句柄,但到目前为止我没有成功。代码很简单:

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;

title var 中没有返回任何内容... GetWindowText 函数只是一个测试,看看我是否有正确的句柄,如果是,我应该看到 vnc 客户端标题的权利吗? 谢谢!

【问题讨论】:

  • ProcInfo.hProcess 是一个进程句柄。 GetWindowText 需要一个 window 句柄。它们根本不是一回事,就像门把手是刀柄一样。

标签: delphi winapi delphi-2010


【解决方案1】:

窗口句柄和进程句柄不是一回事。对于GetWindowText,您需要一个窗口句柄。

  1. 创建进程后调用WaitForInputIdle 以允许进程启动并创建其主窗口。
  2. 调用EnumWindows 枚举顶层窗口。
  3. 对于每个顶级窗口,调用GetWindowThreadProcessId 以找出创建该窗口的进程的进程ID。您创建的进程的进程 ID 是ProcInfo.dwProcessId
  4. 当您找到一个进程 ID 与您刚刚创建的进程匹配的窗口时,该窗口就是您的对象!

【讨论】:

  • 您可能需要包含类名或可见性等。测试到第四步,因为许多进程会创建多个顶级窗口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 2014-05-22
  • 2012-11-22
相关资源
最近更新 更多