2009-06-17 3 views
6

Quando di un'applicazione principale Form - quello passato a Application.Run() - haForm.ShowInTaskBar/Process.MainWindowHandle

this.ShowInTaskBar = false; 

poi, un'istanza di Process rappresentare che l'applicazione ha un MainWindowHandle di 0, il che significa che non lo fa Process.CloseMainWindow() lavoro.

Come posso aggirare questo? Devo chiudere in modo pulito lo Form tramite l'istanza Process.

risposta

2

Ho trovato un modo alternativo per farlo tornando su roba Win32 e utilizzando i titoli delle finestre. È disordinato, ma funziona per la mia situazione.

L'esempio ha il menu di scelta rapida di un'istanza dell'applicazione che chiude tutte le istanze di tale applicazione.

[DllImport("user32.dll")] 
public static extern int EnumWindows(EnumWindowsCallback x, int y); 
public delegate bool EnumWindowsCallback(int hwnd, int lParam); 
[DllImport("user32.dll")] 
public static extern void GetWindowText(int h, StringBuilder s, int nMaxCount); 
[DllImport("user32.dll")] 
public static extern IntPtr PostMessage(IntPtr hWnd, int msg, int wParam, int lParam); 
private void ContextMenu_Quit_All(object sender, EventArgs ea) 
{ 
    EnumWindowsCallback itemHandler = (hwnd, lParam) => 
    { 
     StringBuilder sb = new StringBuilder(1024); 
     GetWindowText(hwnd, sb, sb.Capacity); 

     if ((sb.ToString() == MainWindow.APP_WINDOW_TITLE) && 
      (hwnd != mainWindow.Handle.ToInt32())) // Don't close self yet 
     { 
      PostMessage(new IntPtr(hwnd), /*WM_CLOSE*/0x0010, 0, 0); 
     } 

     // Continue enumerating windows. There may be more instances to close. 
     return true; 
    }; 

    EnumWindows(itemHandler, 0); 
    // Close self .. 
}