Я пишу проект С#, который относительно прост. Подумайте об "общедоступном веб-терминале". По сути, это развернутая форма с прикрепленным к ней веб-браузером. Элемент управления веб-браузером, который я использую, — это элемент управления 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);