WPF 访问打开的打印对话框并关闭它们

Posted

技术标签:

【中文标题】WPF 访问打开的打印对话框并关闭它们【英文标题】:WPF accessing opened print dialog and close them 【发布时间】:2013-06-21 08:23:46 【问题描述】:

我有一个 WPF 应用程序,需要在闲置 5 分钟后注销用户。

但是如果用户打开任何页面的打印对话框,并且在 5 分钟内不触摸屏幕, 即使我注销用户并清除所有子元素,打印对话框仍然停留在 WPF 表单的顶部,并且有人可以来继续打印用户留下的任何页面。

我试过用;

Window window = Application.Current.MainWindow;

FocusManager.GetFocusedElement();

但无法访问 PrintDialog 并关闭它。

如果用户没有响应打印对话框,有什么方法可以访问并关闭它?

【问题讨论】:

当您注销用户时,您是否具有对PrintDialog 对象的编程访问权限?如果是这样,您可以尝试调用Dispose 方法或Reset 方法。或者,虽然不是很好,但是否可以在用户退出后简单地重新启动程序? WPF 控件的某些部分嵌入了 WebBrowser 控件,当用户在 WebBrowser 控件中单击打印时,javascript 会触发 PrintDialog。然后我没有那个时刻的 PrintDialog 参考。 为什么你原来的答案不好了?你也看过我对这个问题的回答:***.com/questions/7926107/force-close-of-messagebox(顺便说一句:White 使用 UI 自动化)。 目前还不清楚 5 分钟后还会发生什么。程序是在没有用户登录的情况下继续运行,还是应该退出? 由于打印对话框属于 JS 而不是 C#,我猜你可能无法轻松访问和关闭它。但是您可以将 JavaScript 代码注入 WebBrowser 控件...也许您应该询问如何从 JavaScript 关闭对话框,然后尝试将该代码注入 WebBrowser。 【参考方案1】:

我通过使用解决了这个奇怪的问题

白色项目。 http://white.codeplex.com/wikipage?title=Working%20with%20window&referringTitle=Programming%20using%20white

通过使用应用程序类,我可以访问 WPF 项目中的所有 ModalDialogs,并关闭它们。

  Application application = White.Core.Application.Attach(Process.GetCurrentProcess().Id);

private void dispatcherTimer_Tick(object sender, EventArgs e)
    
        White.Core.UIItems.WindowItems.Window window = application.GetWindow("MainWindow");
        List<White.Core.UIItems.WindowItems.Window> modalWindows = window.ModalWindows();
        foreach (White.Core.UIItems.WindowItems.Window modalWindow in modalWindows)
        
            modalWindow.Close();
        
    

【讨论】:

【参考方案2】:

您可以为此使用 p/invoke。 使用 findwindow 查找任何窗口并使用 destroywindow 关闭它。

https://msdn.microsoft.com/en-us/library/windows/desktop/ms633499(v=vs.85).aspx

【讨论】:

【参考方案3】:

如果我理解正确,您可以在 5 分钟后注销用户(我假设是通过计时器事件处理程序),但如果打印对话框已打开,则打印输出仍会发生。

问题是,这里真正重要的是关闭对话框还是阻止后续打印输出?另外,您是注销用户但让程序继续运行,还是程序退出?

如果应用程序应该关闭,那么您的代码可以调用 Application 对象的 Shutdown() 方法,该方法将在关闭过程中关闭所有模式对话框。

如果应用程序应该在没有当前用户的情况下继续运行,那么我认为 White 库是您的最佳选择。目前还不清楚你为什么离开这里。

然而,无论是否关闭打印对话框,打印代码都应该在实际打印之前检查用户是否仍然登录。如果在屏幕上打印对话框时登录过期,打印代码应该直接退出而不打印任何内容。

【讨论】:

以上是关于WPF 访问打开的打印对话框并关闭它们的主要内容,如果未能解决你的问题,请参考以下文章

一个WPF开发的打印对话框-PrintDialogX

打印对话框关闭后自动关闭窗口

如何在WPF中进行模态对话?

关闭引导 js 对话框而不点击 wpf

打开文件对话框并使用 WPF 控件和 C# 选择文件

用WPF 如何弹出文件选择对话框