Получение бездействия / простоя в приложении WPF - PullRequest
9 голосов
/ 10 июля 2009

Я искал лучший подход, чтобы выяснить, не работают ли мои пользователи в моем приложении WPF. В настоящее время я беру это простое из операционной системы, и если они минимизируют приложение, и идут и ищут в Интернете, в операционной системе есть процесс, поэтому операционная система не считает это временем бездействия, даже если они не что-нибудь внутри приложения. Тем не менее, я хотел бы выяснить, не нажимали ли они или не делали что-либо внутри моего приложения.

Вот как я могу это время простоя прямо сейчас.

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 ]

12 голосов
/ 29 ноября 2011
public MainWindow()
    {
        InitializeComponent();
        ComponentDispatcher.ThreadIdle += new System.EventHandler(ComponentDispatcher_ThreadIdle);
    }

void ComponentDispatcher_ThreadIdle(object sender, EventArgs e)
    {
        //do your idle stuff here
    }
3 голосов
/ 14 июня 2011

Смотрите этот ответ: Application.Idle событие не запускается в приложении WPF

ComponentDispatcher.ThreadIdle - это событие, которое вы ищете.

1 голос
/ 03 марта 2017
  1. Для таких сценариев нам нужен Timer, который возвращает event после timeinterval.

  2. И самое главное, нам нужен callback / eventhandler, который вызывается каждый раз, когда в нашем приложении происходит любое действие любого рода, поэтому мы знаем, что наше приложение running.

Точка 1 может быть обработана с помощью DispatcherTimer.

Точка 2 может быть обработана с помощью public event CanExecuteRoutedEventHandler CanExecute;.

В целом:

MainWindow.xaml

XMLNS: CMD = "CLR-имена: System.Windows.Input; сборка = Presentationcore "

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

Мы можем легко расширить этот подход для удовлетворения наших потребностей.

0 голосов
/ 11 июля 2009

Как насчет подписки на SENS события?

Вот другая ссылка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...