在WPF应用程序中获取不活动/空闲时间

时间:2009-07-10 19:49:25

标签: c# wpf

我一直在寻找最好的方法来找出我的用户是否在我的WPF应用程序中空闲。目前,我从操作系统中获取这个空闲时间,如果它们最小化应用程序,并在Internet上搜索,则操作系统中有一个进程,因此操作系统不会将此视为非活动时间,即使它们没有进行应用程序内的任何内容但是,我想知道他们是否没有点击或在我的申请中做任何事情。

这就是我现在的空闲时间。

myApplication.MainMethod()
    {
        System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
        myTimer .Interval = 1000;
        myTimer .Tick += new EventHandler(Timer_Tick);
        myTimer .Start();
    }

    void Timer_Tick(object sender, EventArgs e)
    {
        int idleTime= (int)Win32.GetIdleTime();
        if (idleTime<certainNumber)
        {
         //do this
         }
    }

4 个答案:

答案 0 :(得分:12)

public MainWindow()
    {
        InitializeComponent();
        ComponentDispatcher.ThreadIdle += new System.EventHandler(ComponentDispatcher_ThreadIdle);
    }

void ComponentDispatcher_ThreadIdle(object sender, EventArgs e)
    {
        //do your idle stuff here
    }

答案 1 :(得分:3)

看到这个答案: Application.Idle event not firing in WPF application

ComponentDispatcher.ThreadIdle是您要查找的事件。

答案 2 :(得分:1)

  1. 对于此类情况,我们需要一个Timer,在event之后会激活一些timeinterval

  2. 最重要的是,我们需要一个callback / eventhandler,每当我们的应用程序中发生任何类型的任何活动时都会调用它,以便我们知道我们的应用程序是running

  3. 可以使用DispatcherTimer处理第1点。

    可以使用public event CanExecuteRoutedEventHandler CanExecute;处理第2点。

    完全放弃:

    <强> MainWindow.xaml

      

    的xmlns:CMD =&#34; CLR-名称空间:System.Windows.Input;   装配= Presentationcore&#34;

        <!-- a do nothing button -->
        <Button  Command="{x:Static cmd:NavigationCommands.BrowseBack}" Visibility="Collapsed">
            <Button.CommandBindings>
        <!-- we can use any pre-defined / user-defined command -->
                <CommandBinding Command="{x:Static cmd:NavigationCommands.BrowseBack}" CanExecute="CommandBinding_CanExecute_1"/>
            </Button.CommandBindings>
        </Button>
    

    <强> MainWindow.xaml.cs

        public partial class MainWindow: Window
        {
            DispatcherTimer timer = new DispatcherTimer(DispatcherPriority.ApplicationIdle);
            bool running = true;
    
            public MainWindow()
            {
                InitializeComponent();
                timer.Interval = TimeSpan.FromSeconds(5);
                timer.Tick += timer_Tick;
                timer.Start();
            }
    
            private void CommandBinding_CanExecute_1(object sender, CanExecuteRoutedEventArgs e)
            {
                running = true;
                e.CanExecute = true;
            }
    
            void timer_Tick(object sender, EventArgs e)
            {
                if (!running)
                    App.Current.Shutdown();
    
                running = false;
            }
        }
    

    我们可以轻松扩展这种方法以满足我们的需求。

答案 3 :(得分:0)

如何订阅SENS个活动?

这是another link