none
Process 類別的 handle 和 MainWindowHandle 差異在哪? RRS feed

  • 問題

  • Process 類別的 handle 和 MainWindowHandle 差異在哪?

    又跟 FindWindow API 傳回的 handle 有什麼區別呢?

    因為我使用 ShowWindow & SetForegroundWindow API 發現

    若傳入 Process.MainWindowHandle 可以讓視窗變成前景視窗

    但是若傳入 FindWindow API 傳回的 handle 就不行, 有點困惑!

    請高手解惑一下

    2007年3月16日 上午 08:51

解答

  • Process 的 Handle 是行程識別碼(SDK/MFC 說的 hProcess)。
    Process 的 MainWindowHandle 是視窗識別碼(SDK/MFC 說的 Hwnd)。

    一個 Process 只會有一個行程識別碼,但會有很多個 Hwnd。
    你用 FindWindow 得到的 Hwnd 也不一定會是你要的行程的 Hwnd,除非你能確定:

    Process.MainWindowHandler = FindWindow(...)

    否則 ShowWindow() 和 SetForegroundWindow() 也不一定會生效吧。

    2007年3月16日 上午 09:04
    版主

所有回覆

  • Process 的 Handle 是行程識別碼(SDK/MFC 說的 hProcess)。
    Process 的 MainWindowHandle 是視窗識別碼(SDK/MFC 說的 Hwnd)。

    一個 Process 只會有一個行程識別碼,但會有很多個 Hwnd。
    你用 FindWindow 得到的 Hwnd 也不一定會是你要的行程的 Hwnd,除非你能確定:

    Process.MainWindowHandler = FindWindow(...)

    否則 ShowWindow() 和 SetForegroundWindow() 也不一定會生效吧。

    2007年3月16日 上午 09:04
    版主
  • 感謝

    原來是行程識別碼和視窗識別碼的分別

    可是 我找到的那個視窗是我用 .net 寫的測試程式

    裡面只有一個Form

    那他的視窗識別碼 和 Process.MainWindowHandle

    怎麼會不同呢? 難道說 一個Form 上可以有很多視窗識別碼?

    2007年3月17日 上午 03:55
  • 你可以使用 VS 附的 Spy++ 去看你的目標程式。(spyxx.exe)

    每一個視窗都有獨立的 hWnd ,也可以包含多個 hWnd ,比如說你一個 Form 下面包 TextBox ,TextBox 就擁有自己的 hWns ,Form 只是 TextBox 上層的 hWnd ,訊息轉送時會針對視焦所在的 hWnd 反應。

    2007年3月17日 上午 05:58
    版主
  • 我知道了

    我是用同一隻程式在測試

    所以我以為應該抓到的就是 previous instance

    結果 FindWindow 忘了排除自己

    所以每次都抓到 current instance

    現在問題解決了,感謝兩位大大的指點

    2007年3月17日 上午 07:08