none
怎样根据进程ID获取窗体句柄 RRS feed

  • 问题

  • 我用的。net 2005,如下启动一个进程:

    Dim oProcess As New Process()
            Dim strApp As String
            Dim strAug As String

            strApp = "d:\qq2012\bin\qq.exe"
            strAug = " "
            Dim oStartInfo As New ProcessStartInfo(strApp, strAug)
            With oStartInfo
                .UseShellExecute = False
                .RedirectStandardOutput = True

            End With
            oProcess.StartInfo = oStartInfo
            oProcess.Start()

    之后我想获取这个进程启动的窗体(这里是QQ)的句柄,我用oProcess.MainWindowHandle,不行,请问还有什么别的办法么?在线急等,恳请告知,非常感谢。

    2013年2月1日 6:20

全部回复

  • 2013年2月1日 12:03
    版主
  • 感谢您的回复。用findwindow是可以,但那还不如我用枚举。我是要根据oprocess启动的进程获取这个进程的窗体。比如我已经启动了多个QQ,用findwindow那会都找出来吧?所以我要根据进程id去查找窗口。我在网上看到一个思路是枚举所有句柄,根据窗口句柄找到对应的进程id,如果符合就~只是我不知道具体怎么做。还有就是我看到有一个EnumThreadWindows的API,更加没找到相关资料,恳请指点。

    2013年2月2日 0:31
  • 有一个网站pinvoker可以生成.NET使用的Windows API代码,http://www.pinvoker.com/。 另外在Process.MainWindowHandle 属性中,有这样一个方法,可以试试:

    如果刚启动了一个进程,并且想使用其主窗口句柄,则请考虑使用 WaitForInputIdle 方法让该进程完成启动,从而确保创建了主窗口句柄。否则,将引发异常。


    Shanks Zen
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年2月4日 2:23
    版主
  • 谢谢,我用了WaitForInputIdle ,获取到的还是0~

    2013年2月4日 2:53
  • 继续等待大家的回复~
    2013年4月26日 7:16
  • 我以前是用FindWindow和Enum枚举来做的。貌似你不倾向这样做 。。。

    网上找了一个

    //set a new function 
    function GetHwndFromProcess(ProcessId: DWORD): HWND;
      function _EnumWindowsProc(P_HWND: Cardinal; lParam: Cardinal): Boolean; stdcall;
      var
        PID: DWORD;
      begin
        GetWindowThreadProcessId(P_HWND, @PID);
        if PCardinal(lParam)^ <> PID then
          Result := True
        else
        begin
          Result := False;
          PCardinal(lParam+4)^ := P_HWND;
        end;
      end;
    
    var
      Buffer: array[0..1] of Cardinal;
    begin
      Result := 0;
      Buffer[0] := ProcessId;
      Buffer[1] := 0;
      EnumWindows(@_EnumWindowsProc, Integer(@Buffer));
      if Buffer[1] > 0 then Result := Buffer[1];
    end; 
    


    No music, no way coolchae@gmail.com

    2013年4月28日 2:00
  • 不管怎样谢谢你~看来暂时没有更好的办法了~
    2013年5月8日 9:10