Form.ShowInTaskBar / Process.MainWindowHandle
Frage
Wenn ein Haupt Form
der Anwendung - die eine Application.Run()
bestanden - hat
this.ShowInTaskBar = false;
dann eine Instanz von Process
, dass die Anwendung darstellt, hat eine MainWindowHandle
von 0
, was bedeutet, dass Process.CloseMainWindow()
funktioniert nicht.
Wie kann ich dieses Problem umgehen? Ich muss sauber die Form
schließen über die Process
Instanz.
Lösung
fand ich einen alternativen Weg, es zu tun, indem sie wieder zu Win32 Sachen Schritt und mit Fenstertiteln. Es ist chaotisch, aber es funktioniert für meine Situation.
Das Beispiel hat das Kontextmenü einer Anwendungsinstanz alle Instanzen dieser Anwendung zu schließen.
[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 ..
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow