我正在構建一個應用程序,我需要定期獲取有關用戶鍵盤的信息。它將成爲用戶空閒檢測應用程序。我有一個相當簡單的解決方案來定期檢查鼠標是否被移動。但我無法想象任何合理的非根方法來檢測鍵盤是否被按下。如何捕捉X中的任何鍵?
我正在考慮註冊一個掛鉤每個計時器超時,並在任何按鍵註銷它。所以如果長時間沒有按鍵,我的程序就會知道用戶是否空閒。
無論如何,我找不到任何鍵的全局鉤子,包括修飾符。是否有捷徑可尋?或者有人有更好的方法來檢測鍵盤閒置?
謝謝,大衛·波拉克
我正在構建一個應用程序,我需要定期獲取有關用戶鍵盤的信息。它將成爲用戶空閒檢測應用程序。我有一個相當簡單的解決方案來定期檢查鼠標是否被移動。但我無法想象任何合理的非根方法來檢測鍵盤是否被按下。如何捕捉X中的任何鍵?
我正在考慮註冊一個掛鉤每個計時器超時,並在任何按鍵註銷它。所以如果長時間沒有按鍵,我的程序就會知道用戶是否空閒。
無論如何,我找不到任何鍵的全局鉤子,包括修飾符。是否有捷徑可尋?或者有人有更好的方法來檢測鍵盤閒置?
謝謝,大衛·波拉克
經過大量的搜索,我發現這個:
bool kbdActivity(Display* display) // checks for key presses
{
XQueryKeymap(display, keymap); // asks x server for current keymap
for (int i=0; i<32; i++) // for 0 to 32 (keymap size)
{
if (prevKeymap[i] != keymap[i]) // if previous keymap does not
{ // equal current keymap
XQueryKeymap(display, prevKeymap); // ask for new keymap
return true; // exit with true
}
}
return false; // no change == no activity
}
當我把它的每100-300ms它檢測到X.任何地方的按鍵
看一看xautolock
來源,這不正是你需要的,對於鍵盤和鼠標。 http://www.ibiblio.org/pub/Linux/X11/screensavers/xautolock-2.2.tgz
我有一些代碼,可以跟蹤鍵盤活動給你。
#include "stdafx.h"
#include <stdio.h>
#include "windows.h"
#include "iostream"
using namespace std;
int main(void)
{
HANDLE hStdInput, hStdOutput, hEvent;
INPUT_RECORD ir[128];
DWORD nRead;
COORD xy;
UINT i;
hStdInput = GetStdHandle(STD_INPUT_HANDLE);
hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
FlushConsoleInputBuffer(hStdInput);
hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
HANDLE handles[2] = { hEvent, hStdInput };
while (WaitForMultipleObjects(2, handles, FALSE, INFINITE))
{
ReadConsoleInput(hStdInput, ir, 128, &nRead);
for (i = 0; i<nRead; i++)
{
switch (ir[i].EventType)
{
case KEY_EVENT:
if (ir[i].Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)
SetEvent(hEvent);
else
{
xy.X = 0; xy.Y = 0;
SetConsoleCursorPosition(hStdOutput, xy);
printf
(
"AsciiCode = %d: symbol = %c\n",
ir[i].Event.KeyEvent.uChar.AsciiChar,
ir[i].Event.KeyEvent.uChar.AsciiChar
);
// note that some keys have a AsciiCode of 0 such as shift, ctrl, and the
// rest you can try out yourself
}
break;
}
}
};
return 0;
}
在此代碼它跟蹤鍵盤活動和現在它表明你按下鍵和AsciiCode,也爲Shift,Ctrl等鍵的名稱將不會顯示。
您可能必須實現此代碼,因爲我最初將其用於安全系統,但它可以非常簡單地進行更改以達到您的目的。 DREAM BIG認爲BIG DO BIG – genius 2014-11-06 01:19:23
「any」鍵在哪裏? – 2010-05-30 19:11:48
右邊F13 ... – Meltea 2010-05-30 19:48:23