Я пытаюсь получить метку времени в микросекундах при нажатии и отпускании клавиши клавиатуры. Я новичок в C и использую его, потому что Python был слишком медленным. Затем я хочу напечатать это на клавиатуре в следующем формате:
press
a
8029682
Если бы я нажал клавишу a
8029682
микросекунд с момента запуска программы.
Моя текущая реализация должна заполнить массив символов всеми символами, которые в данный момент нажаты, а затем проверить, все ли они нажаты. Если это не так, он удалит их и распечатает, что ключ был выпущен. kbhit()
и getch()
из conio.h
.
void logPath() {
long startTime = getMicrotime();
char c = '\0';
char arr[] = "";
strcpy(arr, "");
while (1) {
if (kbhit()) {
c = getch();
}
char newArr[] = "";
/* If a key isn't currently being pressed, remove it and notify */
for(int i=0; i<sizeof arr-1; i += 1) {
if (GetKeyState(arr[i])) {
strncat(newArr, &arr[i], 1);
} else {
printf("unpress\n%c\n%lu \n", arr[i], getMicrotime() - startTime);
}
}
strcpy(arr, newArr);
/* If a key has been pressed */
if (c != '\0') {
if(strchr(arr, c) == NULL) {
printf("press\n%c\n%lu \n", c, getMicrotime() - startTime);
strncat(arr, &c, 1);
}
c = '\0'; // and put it back to \0
}
Sleep(1000* .5);
}
}
Я правильно получаю отпечатки при выполнении If a key has been pressed
logi c, но arr заполняется бессмысленными символами. Что я делаю не так?
РЕДАКТИРОВАТЬ: Python реализация
def log_path(self, log_path):
actions = []
with open(log_path, 'w') as f:
def press(key, pressed):
now = dt.datetime.now()
global BASE_TIME
if BASE_TIME is None:
BASE_TIME = now
global last_action_pressed
if not key in last_action_pressed:
last_action_pressed[key] = False
if pressed != last_action_pressed[key]:
# f.write(f'{key} - pressed - ' + str(dt.datetime.now() - BASE_TIME) + '\n')
key_txt = f'{key}'
try:
delta = (now - BASE_TIME).total_seconds() - actions[-1]['time']
except:
delta = None
actions.append({
'key': key_txt[key_txt.rfind('.')+1:].replace("'", ''),
'time': (now - BASE_TIME).total_seconds(),
'start': pressed,
'delta': delta})
last_action_pressed[key] = pressed
if key == keyboard.Key.esc:
# Stop listener
return False
def on_press(key):
return press(key, True)
def on_release(key):
return press(key, False)
def run_path(self, log_path):
with open(log_path) as f:
data = json.load(f)
actions = data['actions']
print(str(dt.datetime.now()))
for elt in actions:
key = elt['key']
try:
delta = elt['delta']
time.sleep(delta)
except: # this happens on the first element
pass
pya.keyDown(key) if elt['start'] else pya.keyUp(key)