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.

War es hilfreich?

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
scroll top