2014-03-13 31 views
1

爲什麼process.MainWindowHandle在下面的代碼中爲零?process.MainWindowHandle爲零?

Process me = Process.GetCurrentProcess(); 
foreach (Process process in Process.GetProcessesByName(me.ProcessName)) 
        { 
         if (process.Id != me.Id) 
         { 
          MessageBox.Show(string.Format("{0}", process.MainWindowHandle)); 
          ShowWindow(process.MainWindowHandle, 5); 
          ShowWindow(process.MainWindowHandle,3); 
          SetForegroundWindow(process.MainWindowHandle); 
          break; 
         } 
        } 
+0

你確定你的進程有一個與之相關的窗口嗎?它可能不會。實際的窗口可能是一個自己產生的過程。 – ouflak

+1

隱藏的窗口實際上是ShowWindow隱藏的這個過程的另一個實例。 – AVEbrahimi

回答

3

您的窗口被隱藏是一個非常重要的細節。

MSDN article on the Process.MainWindowHandle Property

的方法具有與之相關聯的主窗口僅當過程具有 的圖形界面。如果關聯的進程沒有主窗口,則MainWindowHandle值爲零。 對於已隱藏的 進程,該值也爲零,即在任務欄中不可見的進程不是 。

+0

謝謝。所以我該怎麼做? – AVEbrahimi

+0

我想你可以簡單地讓窗口在任務欄上可見,並且使用定時器在短時間間隔內檢查窗口句柄。一旦你得到它,然後照常隱藏你的過程。只要您的進程正在運行,該窗口句柄將保持不變(http://stackoverflow.com/questions/6772634/can-a-window-handle-in-net-change-its-value)。即使MainWindowHandle返回零,只要該窗口存在,您可以通過其他方式訪問它併發送消息。看起來雖然,如果你使用的是表單,這可能並不確定。然後... – ouflak

+0

...您可能必須「重新創建」句柄以確保您訪問相同的窗口。 – ouflak

0

Process.MainWindowHandle屬性使用啓發式來確定主窗口是什麼,但這並不總是奏效。 嘗試使用EnumWindows。 我寫了一個tutorial關於如何使用這個。