.NET - обнаружение движения мыши через упрямый контроль

StackOverflow https://stackoverflow.com/questions/3569899

  •  01-10-2019
  •  | 
  •  

Вопрос

Я пишу проект C #, который относительно прост. Подумайте «Общественный веб-терминал». По сути, на нем возникает максимальная форма с заливным веб-браузером. Контроль веб-браузера Я использую это управление WebKit, найденным здесь:

Страница загрузки webkit

Я пытаюсь обнаружить систему холостого времени, сохраняя DateTime, которая представляет в последний раз движение мыши или нажмите кнопку.

Я установил обработчики событий (см. Код ниже) и столкнулся с камнемся блоком. События мыши (и ключей), кажется, не огонь, когда моя мышь движется над веб-документом. Он работает нормально, когда моя мышь коснутся вертикальной панели прокрутки панели управления веб-браузером, поэтому я знаю, что код в порядке - кажется, какой-то «надзор» (из-за отсутствия лучшего слова) на части управления.

Я думаю, что мой вопрос - ко всем вам кодексам там, как бы вы пошли о обращении с этим?

this.webKitBrowser1.KeyPress += new KeyPressEventHandler(handleKeyPress);
this.webKitBrowser1.MouseMove += new MouseEventHandler(handleAction);
this.webKitBrowser1.MouseClick += new MouseEventHandler(handleAction);
this.webKitBrowser1.MouseDown += new MouseEventHandler(handleAction);
this.webKitBrowser1.MouseUp += new MouseEventHandler(handleAction);
this.webKitBrowser1.MouseDoubleClick += new MouseEventHandler(handleAction);

void handleKeyPress(object sender, KeyPressEventArgs e)
{
    this.handleAction(sender, null);
}

void handleAction(object sender, MouseEventArgs e)
{
    this.lastAction = DateTime.Now;
    this.label4.Text = this.lastAction.ToLongTimeString();
}

ОБНОВИТЬ

Использование принятого решения Joe, я собрал следующий класс. Спасибо всем, кто принимал участие.

class classIdleTime
{
    [DllImport("user32.dll")]
    static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);

    internal struct LASTINPUTINFO
    {
        public Int32 cbSize;
        public Int32 dwTime;
    }

    public int getIdleTime()
    {
        int systemUptime = Environment.TickCount;
        int LastInputTicks = 0;
        int IdleTicks = 0;

        LASTINPUTINFO LastInputInfo = new LASTINPUTINFO();
        LastInputInfo.cbSize = (Int32)Marshal.SizeOf(LastInputInfo);
        LastInputInfo.dwTime = 0;

        if (GetLastInputInfo(ref LastInputInfo))
        {
            LastInputTicks = (int)LastInputInfo.dwTime;
            IdleTicks = systemUptime - LastInputTicks;
        }
        Int32 seconds = IdleTicks / 1000;
        return seconds;
    }

ПРИМЕНЕНИЕ

idleTimeObject = new classIdleTime();
Int32 seconds = idleTimeObject.getIdleTime();
this.isIdle = (seconds > secondsBeforeIdle);
Это было полезно?

Решение

Вы можете просто попросить Windows, если пользователь простаивает. Вам придется использовать P / Invoke, но это было бы самым простым. Проверьте Getlastinputinfo. функция.

Другие советы

Это похоже на приложение WinForms - почему нет Добавить АН IMessageFilter? Вы получите посмотреть каждое сообщение Windows, которое проходит через петлю события, будь то нацелен на браузер или в другом месте.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top