关闭WPF应用程序中打开的对话框(不仅仅是窗口)

本文关键字:对话框 不仅仅是 窗口 WPF 应用程序 关闭 | 更新日期: 2023-09-27 18:10:16

根据找到的解决方案在这里,我可以遍历Application.Current.Windows列表,并在退出系统时关闭它们。然而,有一个对话框(OpenFileDialog或类似的)可能是打开的可能性;不幸的是,这个对话框不在Current.Windows的集合中。是否有其他方法可以确保所有这样的对话框都关闭(例如,不必将它们的集合存储在某个地方?)

关闭WPF应用程序中打开的对话框(不仅仅是窗口)

要找到所有传统的Win32窗口,您需要枚举线程上的窗口并关闭它们。

一些有用的函数和常量的声明:

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, IntPtr windowTitle);
[DllImport("user32.dll", SetLastError = true)]
static extern uint GetWindowThreadProcessId(IntPtr hwnd, IntPtr processId);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool EnumThreadWindows(uint dwThreadId, EnumThreadFindWindowDelegate lpfn, IntPtr lParam);
[DllImport("user32", SetLastError = true, CharSet = CharSet.Auto)]
private extern static int GetWindowText(IntPtr hWnd, StringBuilder text, int maxCount);
[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(int hWnd, int Msg, int wParam, int lParam);
const uint WM_CLOSE = 0x10;

你需要一个委托声明的回调枚举子:

public delegate bool EnumThreadFindWindowDelegate(IntPtr hwnd, IntPtr lParam);

回调本身,它关闭找到的每个窗口。如果有不希望关闭的窗口,例如顶层窗口,则需要在此处添加自己的标准。我在下面添加了一些注释掉的代码来获得窗口标题,例如:

static bool EnumThreadCallback(IntPtr hWnd, IntPtr lParam)
{
    // If you want to check for a non-closing window by title...
    // Get the window's title
    //StringBuilder text = new StringBuilder(500);
    //GetWindowText(hWnd, text, 500);
    SendMessage(hWnd, WM_CLOSE, 0, 0);
    // Continue
    return true;
}

执行枚举:

uint threadId = Thread.CurrentThread.ManagedThreadId;
EnumThreadWindows(threadId, EnumThreadCallback, IntPtr.Zero);
相关文章: