Монитор мигает при запуске Windows SendInput API - PullRequest
1 голос
/ 29 апреля 2020

Ну, я, конечно, должен go до python, так как я выполнил несколько функций этого типа, события клавиатуры и мыши, но решил попробовать изучить windows api.

Моя цель нужно знать, когда нажата кнопка 1 мыши.

Я создал этот файл очень начинающим способом, он возвращает в mouseData только 0. Любопытно, что всякий раз, когда я запускаю его, он мигает моим монитором в короткие интервалы в морганиях, но между 1 секундой с выключенным. Очень странно, что выполнение не является жизнеспособным.

Может ли кто-нибудь помочь мне понять и попытаться выполнить, чтобы увидеть, если это только здесь.

Код:

int main()
{
    DWORD mouseData = 0;

    MOUSEINPUT tagMouse;
    tagMouse.dx = 0;
    tagMouse.dy = 0;
    tagMouse.mouseData = mouseData;
    tagMouse.dwFlags = MOUSEEVENTF_XDOWN;
    tagMouse.dwExtraInfo = 0;

    INPUT tagInput;
    tagInput.type = INPUT_MOUSE;
    tagInput.mi = tagMouse;

    while (true) {
        if (GetAsyncKeyState(VK_DELETE)) break;
        SendInput(1, &tagInput, sizeof(INPUT));
        printf("KEYWORD: %d\n", mouseData);
        Sleep(500);
    }
    system("pause");
    return 0;
}

1 Ответ

0 голосов
/ 29 апреля 2020

Я могу воспроизвести ваши сообщения о "симптомах" - и эффект действительно жестокий!

Теперь, пока я не могу дать полное объяснение, я могу предложить исправить! В вашей структуре tagMouse есть неинициализированное поле (элемент time, который является отметкой времени, используемой системой). Установка этого значения в ноль (которое говорит системе генерировать собственную метку времени) устраняет проблему. Итак, просто добавьте эту строку в ваши другие операторы инициализатора:

//...
    tagMouse.dwExtraInfo = 0;
    tagMouse.time = 0; // Adding this line fixes it!
//...

Надеюсь, это поможет!

Примечание: я тоже был бы признателен за более полное объяснение; однако, неинициализированное поле для меня пахнет неопределенным поведением! Я пробовал множество других значений (т. Е. Не ноль) для поля time, но пока не нашел работающего.

Обсуждение здесь на devblogs может помощь. Эта цитата кажется уместной:

И кто знает, какой тип havo c создаст, если программа проверит метки времени и обнаружит, что они либо из будущего, либо путешествовали назад во времени.

...