7

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

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

我尝试使用;

Window window = Application.Current.MainWindow;

或者

FocusManager.GetFocusedElement();

但无法访问 PrintDialog 并关闭它。

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

4

3 回答 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();
        }
    }
于 2013-06-24T19:00:24.083 回答
1

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

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

于 2015-06-01T19:42:22.783 回答
0

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

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

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

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

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

于 2015-05-31T19:04:43.657 回答