سؤال

عند Form الرئيسي أحد التطبيقات - واحد تمريرها إلى Application.Run() - لديها

this.ShowInTaskBar = false;

وبعد ذلك، مثيل Process يمثل هذا التطبيق لديه MainWindowHandle من 0، وهذا يعني أن Process.CloseMainWindow() لا تعمل.

وكيف يمكنني الحصول على حول هذا؟ ولست بحاجة لإغلاق نظيفة أسفل Form عبر المثال Process.

هل كانت مفيدة؟

المحلول

ولقد وجدت وسيلة بديلة لتفعل ذلك التراجع إلى Win32 والاشياء واستخدام عناوين النافذة. انها الفوضى، لكنه يعمل لحالتي.

والمثال لديه قائمة سياق سبيل المثال تطبيق واحد إغلاق كافة مثيلات هذا التطبيق.

[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 ..
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top