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

7
我有一个WPF应用程序,需要在5分钟内未活动后注销用户。
但是,如果用户打开任何页面的打印对话框,并且5分钟内不触摸屏幕,即使我注销用户并清除所有子元素,打印对话框仍会停留在WPF表单的顶部,某人可以继续打印用户所停留的任何页面。
我尝试使用;
Window window = Application.Current.MainWindow;

或者

FocusManager.GetFocusedElement();

但无法访问PrintDialog并关闭它。

是否有方法可以访问它并在用户未响应打印对话框时关闭它?


当用户注销时,您是否可以以编程的方式访问PrintDialog对象?如果可以的话,您可以尝试调用Dispose方法或Reset方法。或者,虽然不太好,但是在用户注销后是否可能简单地重新启动程序? - keyboardP
WPF控件在某些部分嵌入了WebBrowser控件,当用户在WebBrowser控件内点击打印时,JavaScript会触发PrintDialog。然后我就无法引用那个时刻的PrintDialog。 - Teoman shipahi
为什么你原来的答案不再好用了?另外,你看到我对这个问题的回答了吗:https://dev59.com/LWsz5IYBdhLWcg3wZm7Q (顺便说一下:White使用UI自动化)。 - Simon Mourier
5分钟后还应该发生什么事情还不清楚。程序是否会在没有用户登录的情况下继续运行,还是应该退出? - Mike Fulton
由于打印对话框属于JS而不是C#,我猜你可能无法轻松访问和关闭它。但是你可以将JavaScript代码注入到WebBrowser控件中...也许你应该询问如何从JavaScript关闭对话框,然后尝试将该代码注入到WebBrowser中。 - almulo
3个回答

4
我通过使用白色项目解决了这个奇怪的问题。 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();
        }
    }

1

0

如果我理解正确的话,您能够在5分钟标记处注销用户(我假设是通过计时器事件处理程序),但如果打印对话框仍然打开,则打印作业仍可能发生。

问题是,真正重要的是关闭对话框还是防止随后的打印作业?此外,您是注销用户但保持程序运行,还是程序退出?

如果应用程序应该关闭,则您的代码可以调用Application对象的Shutdown()方法,这将关闭任何模态对话框作为关闭过程的一部分。

如果应用程序应该继续运行而没有当前用户,则我认为White库是您最好的选择。不清楚您为什么放弃了它。

无论是否关闭打印对话框,打印代码都应该检查用户是否仍然登录,然后再实际打印。如果登录已过期,而打印对话框仍在屏幕上,则打印代码应该简单地退出而不打印任何内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接