Pergunta

Quando principal Form de um aplicativo - o passado para Application.Run() - tem

this.ShowInTaskBar = false;

então, uma instância de Process representando que a aplicação tem uma MainWindowHandle de 0, o que significa que Process.CloseMainWindow() não funciona.

Como posso resolver isso? Eu preciso limpa fechar a Form através da instância Process.

Foi útil?

Solução

Eu encontrei uma maneira alternativa de fazê-lo por pisar de volta para Win32 coisas e usando os títulos da janela. É confuso, mas funciona para a minha situação.

O exemplo tem o menu de contexto da instância de um aplicativo de fechar todas as instâncias do aplicativo.

[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 ..
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top