Question

Quand le Form principal d'une application - celui transmis à Application.Run () - a

this.ShowInTaskBar = false;

alors, une instance de Process représentant cette application a un MainWindowHandle de 0 , ce qui signifie que Process.CloseMainWindow () ne fonctionne pas.

Comment puis-je contourner cela? J'ai besoin de fermer proprement le Form via l'instance Process .

Était-ce utile?

La solution

J'ai trouvé un moyen alternatif de le faire en revenant à Win32 et en utilisant les titres de fenêtre. C'est désordonné, mais cela fonctionne dans mon cas.

L'exemple contient le menu contextuel d'une instance d'application qui ferme toutes les instances de cette application.

[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 ..
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top