我有一个WPF应用程序,它需要在用户处于非活动状态5分钟后注销。
但如果用户打开任何页面的打印对话框并且在5分钟内不触摸屏幕,即使我注销用户并清除所有子元素,打印对话框仍然停留在WPF表单的顶部,有人可以来继续打印用户停留的页面。
我试着使用;
Window window = Application.Current.MainWindow;
或
FocusManager.GetFocusedElement();
但无法实现对PrintDialog的访问并将其关闭
如果用户没有响应打印对话框,是否有任何方法可以访问并关闭它?
我使用解决了这个奇怪的问题
白色项目。http://white.codeplex.com/wikipage?title=Working%20with%20window&referringTitle=使用%20白色编程%20
通过使用应用程序类,我可以访问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();
}
}
您可以为此使用p/invoke。使用findwindow查找任何窗口,并销毁window关闭它。
https://msdn.microsoft.com/en-us/library/windows/desktop/ms633499(v=vs.85).aspx
如果我理解正确,你可以在5分钟时注销用户(我想是通过计时器事件处理程序),但如果打印对话框是打开的,那么打印输出仍然可能发生。
问题是,这里真正重要的是什么,关闭对话框,还是阻止后续打印?此外,你是注销用户,但保持程序运行,还是程序退出?
如果应用程序应该关闭,那么您的代码可以调用Application对象的Shutdown()方法,该方法将关闭任何模式对话框,作为关闭过程的一部分。
如果应用程序应该在没有当前用户的情况下继续运行,那么我认为White库是你的最佳选择。目前尚不清楚你为什么要放弃它。
但是,无论是否关闭打印对话框,打印代码都应该在实际打印之前检查用户是否仍处于登录状态。如果在屏幕上显示打印对话框时登录已过期,则打印代码应直接退出而不打印任何内容。