自动关闭WPF应用程序

时间:2013-04-25 19:49:09

标签: wpf interop dispatchertimer

如果用户在一段时间内没有使用它,我需要关闭我的应用程序。 我现在使用的方法在单个窗口上工作得很好,但我似乎无法使其全局化。 这就是我现在的表现:

    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;
        }
    }

我的问题是:
是否可以将这个东西变成全局而不是在我创建的每个窗口中重写它? 有更好的方法吗?
谢谢!

2 个答案:

答案 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>