2013-04-25 125 views
0

如果用戶在一段時間內沒有使用過它,我需要關閉我的應用程序。 我現在使用的方法在單個窗口上效果很好,但我似乎無法使其成爲全局。 這是我要做的事現在:自動關閉WPF應用程序

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

我會創建一個基本窗口類,然後讓所有的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> 
0

創建一個單例類並將大部分功能移到那裏。這樣,所有的計時器或線程都可以駐留在那裏,並且所有的窗口或用戶控件都可以調用單例類,並且單獨關閉該應用程序。