mouse_event / PostMessage ключ вниз сообщения - несовместимо с GetKeyState () - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь сделать две вещи:

  1. Отправлять события «нажатия клавиш», как для клавиш клавиатуры, так и для клавиш мыши, в окно внешнего процесса
  2. Позже, запросить, нажата ли данная клавиатура или клавиша мыши в данный момент в этом окне, что может произойти, если
    • Мой инструмент ранее отправлял в окно событие «нажатие клавиши» (но, очевидно, без нажатия клавиши вверх)
    • Пользователь имел какое-либо ручное взаимодействие с окном

Например, одним из случаев может быть то, что я отправляю событие «нажатие клавиши» для левого кнопка мыши в окне. Затем пользователь самостоятельно щелкает внутри окна. В результате после обоих этих взаимодействий окно снова распознает клавишу мыши как «вверх».

До сих пор для нажатия клавиш я использовал вызовы API user32.dll PostMessage (для событий клавиатуры ) и mouse_event (для клавиш мыши).

Что касается получения текущего состояния, я пытался использовать «GetKeyState». Однако его возвращаемые значения несовместимы с фактическим поведением. Например, когда я отправляю ключ вниз через мой инструмент, и больше нет никаких взаимодействий (ни мной, ни пользователем), GetKeyState () по-прежнему возвращает 0 (= клавиша НЕ нажата).

Я предполагаю, что я использую неправильный API для получения состояния здесь (в частности, поскольку GetKeyState также не берет дескриптор окна?). Есть ли способ выяснить фактическое состояние ключа для данного окна? Или я здесь не так?

Спасибо


Пример кода:

    class NativeCalls
    {
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

        [DllImport("user32.dll")]
        public static extern short GetKeyState(int nVirtKey);

        [DllImport("user32.dll")]
        public static extern bool SetForegroundWindow(IntPtr hWnd);

        [DllImport("user32.dll")]
        static extern short GetAsyncKeyState(int vKey);


        public static void test()
        {
            var state_x1 = GetAsyncKeyState(0x41);

            var ok1 = SetForegroundWindow(Globals.Hwnd);
            var ok2 = PostMessage(Globals.Hwnd, 0x0100, 0x41, 0); // key down "A"
            Thread.Sleep(10);
            var state = GetKeyState(0x41); // check if key "A" Is down
            var state_x2 = GetAsyncKeyState(0x41);

            // state_x1, state, and state_x2 are all 0
        }
    }
...