如果用户在一段时间内没有使用它,我需要关闭我的应用程序。 我现在使用的方法在单个窗口上工作得很好,但我似乎无法使其全局化。 这就是我现在的表现:
DispatcherTimer dt;
public Window3()
{
InitializeComponent();
//initialize the timer
dt = new DispatcherTimer();
dt.Interval = TimeSpan.FromSeconds(1);
dt.Start();
dt.Tick += new EventHandler(dt_Tick);
}
long ticks = 0;
void dt_Tick(object sender, EventArgs e)
{
ticks++;
//close the application if 10 seconds passed without an event
if (ticks > 10)
{
Close();
}
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//Initialize a hook
((HwndSource)PresentationSource.FromVisual(this)).AddHook(myHook);
}
private IntPtr myHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
//reset counter
ticks = 0;
switch (msg)
{
// process messages here
default:
return IntPtr.Zero;
}
}
我的问题是:
是否可以将这个东西变成全局而不是在我创建的每个窗口中重写它?
有更好的方法吗?
谢谢!
答案 0 :(得分:0)
创建一个单例类并在那里移动大部分功能。这样你的所有计时器或线程都可以驻留在那里,你的所有窗口或用户控件都可以调用单例类,而这只会关闭应用程序。
答案 1 :(得分:0)
我会创建一个基本窗口类,然后让所有Windows继承它。获得新基类并添加窗口或更新现有窗口以继承它之后,您还必须更改Xaml以反映新的基类。所以,这是一个基本Window类的示例。
public class WindowBase : Window
{
public WindowBase()
{
//initialize timer and hook loaded event
this.Loaded += WindowBase_Loaded;
}
void WindowBase_Loaded(object sender, RoutedEventArgs e)
{
}
}
这是一个继承它的窗口。
public partial class MainWindow : WindowBase
{
public MainWindow()
{
InitializeComponent();
}
}
然后在这里Xaml为同一个窗口
<local:WindowBase x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Grid>
</Grid>
</local:WindowBase>