2014-02-05 13 views
0

我的應用程序構建爲在Shell模式下運行(通過註冊表更改)。當我的應用程序處於Shell模式時,如何訪問手動啓動的Explorer的句柄?

允許用戶定義定製「按鈕」來調用實用程序,如CMD,註冊表編輯器,資源管理器...

當用戶按下被打開一個窗口,其指定的工具的按鈕。

按下應用程序窗口的最小化按鈕,驅動應用程序代碼縮小並將窗口移動到屏幕底部,隨後可由用戶移動或展開。

這適用於Explore.exe的例外。

在以下代碼中,proc.MainWindowHandle爲Emplorer.exe爲空/零。

瞭解這是一個'特例'程序,有沒有什麼辦法來確定Explorer.exe的MainWindowHandle,以便程序也可以管理它呢?

// Minimize all utility windows 
Process[] procs = Process.GetProcesses(); 
Process currentProcess = Process.GetCurrentProcess(); 
IntPtr hWnd; 
foreach (Process proc in procs) 
{ 
    if (proc.Id != currentProcess.Id) 
    { 
     if ((hWnd = proc.MainWindowHandle) != IntPtr.Zero) 
     { 
      WINDOWPLACEMENT wp = new WINDOWPLACEMENT(); 
      GetWindowPlacement(hWnd, ref wp); 

      if (wp.showCmd != (int)ShowWindowCommand.ShowMinimized || wp.showCmd != (int)ShowWindowCommand.Minimize || wp.showCmd != (int)ShowWindowCommand.ShowMinNoActive) 
      { 
       ShowWindowAsync(hWnd, (int)ShowWindowCommand.ShowMinimized); 
      } 

      SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SetWindowPosFlags.IgnoreMove | SetWindowPosFlags.DoNotActivate | SetWindowPosFlags.IgnoreResize); 
     } 
    } 
} 
+0

Explorer創建*許多*窗口。你想成爲哪一個「主」的?一個合適的shell使用一個鉤子來發現Windows,SetWindowsHookEx()和WH_SHELL。 C#是這種鉤子的錯誤語言。 –

回答

0

當然,資源管理器進程可能會負責多個頂級窗口,因此可能需要更多的工作來確定您正在尋找的特定窗口。

+0

您的評論使我能夠訪問我需要的作品。還要感謝你和Hans給出的與Explorer有關的多個頂級窗口的警告。幫助短路所需的努力。 – user3276065

相關問題