.NET - Обнаружение движения мыши с помощью упрямого контроля - PullRequest
2 голосов
/ 26 августа 2010

Я пишу C # Project, который относительно прост.Подумайте «Публичный веб-терминал».По сути, есть развернутая форма с веб-браузером, заполненным заливкой.Элементом веб-браузера, который я использую, является элемент управления 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();
}

ОБНОВЛЕНИЕ

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

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

Ответы [ 2 ]

3 голосов
/ 26 августа 2010

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

2 голосов
/ 26 августа 2010

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

...