Время получения ключа в C - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь получить метку времени в микросекундах при нажатии и отпускании клавиши клавиатуры. Я новичок в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...