Создать экранную клавиатуру - PullRequest
1 голос
/ 09 февраля 2011

Я использую PostMessage для имитации нажатий клавиш в программе, которая находится в фоновом режиме. Он отлично работает, за исключением символов, которые нужно сместить на физической клавиатуре. Как мне смоделировать сдвиг? «

Код, который я использую примерно:

 VK vk = VkKeyScanEx (c, GetKeyboardLayout (0));

 AttachThreadInput (_attachedThredId, _attachedProcessId, true);
 PostMessage       (_window, WM_KEYDOWN, vk.key, 0x1);
 PostMessage       (_window, WM_KEYUP,   vk.key, 0xC0010001);
 AttachThreadInput (_attachedThredId, _attachedProcessId, false);

Как мне обращаться с Расширенной частью ВКонтакте?

Редактировать

Я пытаюсь создать экранную клавиатуру. Каждая кнопка на экранной клавиатуре имитирует последовательность нажатий клавиш. Приемник - это старая программа, которая выполняет различные задачи в зависимости от последовательности клавиш. Последовательность клавиш выглядит следующим образом

  • {ESC} NN {ESC} NN
  • {ESC} NN
  • ½NN
  • §NN

где {ESC} имитирует нажатие клавиши Esc, NN - шестнадцатеричные значения, а § / ½ - прослушивание программы.

Обычно у нас есть специальная физическая клавиатура для управления программой, но они дорогие. Поэтому в тестовой среде, где у нас не всегда есть физические клавиатуры, мы должны вводить эти коды вручную

Ответы [ 3 ]

5 голосов
/ 10 февраля 2011

Вы должны пойти на компромисс:

Если вы хотите имитировать ввод с клавиатуры , тогда вы должны использовать SendInput, что означает, что в зависимости от того, какое окно в данный момент имеет фокус. SendInput похоже на нажатие клавиш на вашей физической клавиатуре. Единственный способ отправить нажатия клавиш в определенное окно с помощью клавиатуры - это ALT+TAB в правом окне.

Если вы хотите отправлять нажатия клавиш в определенное окно , то вы подвергаетесь странному поведению:

  1. Приложения обрабатывают ввод по-разному. И простые сообщения WM_KEYDOWN / WM_KEYUP не единственный способ обнаружить ввод с клавиатуры. Например, есть также состояние клавиатуры (GetKeyboardState()), которое вам будет сложнее имитировать. Скорее всего, это то, что вы испытываете.
  2. Приложения могут полагаться на стандартное поведение фокусировки при получении сообщений ввода с клавиатуры. Размещая сообщения в этих приложениях, вы вызываете странное неупорядоченное поведение, которое может привести к сбою.
  3. Теперь несколько окон в системе могут получать ввод с клавиатуры одновременно. Это также может вызвать странное поведение.
  4. (и т. Д.) Для этого входа не будут вызываться хуки, драйверы клавиатуры / ввода не будут его видеть, его не будут распознавать такие вещи, как DirectInput ... в основном это бесконечная пэчворк из проблем, делая что-то плохим способом.

Нет никакого способа обойти эти побочные эффекты; это следствие создания темных вещей.


Решение для ваших целей , поскольку вы нацеливаетесь на одно конкретное приложение, возможно, будет использоваться PostMessage в сочетании с SetKeyboardState для имитации состояния клавиатуры, включая положения смещения .

2 голосов
/ 09 февраля 2011

Ладно, я думаю, у вас тут беспорядок, PostMessage() печально известен тем, что плохо работает с состояниями сдвига , и хуки не будут вызываться. Microsoft рекомендует взамен SendInput() и я тоже. Я предлагаю вам либо опубликовать новый вопрос, либо обновить его, где вы подробно опишите, чего вы пытаетесь достичь, и, возможно, мы можем лучше порекомендовать другое решение.

Что касается расширенной части, она вообще не имеет к этому никакого отношения и не поможет вам.

То, что вы могли бы попробовать, - это отправка сообщения WM_KEYDOWN, в котором говорится, что была нажата клавиша Shift, а затем отправьте еще одно сообщение с нужной вам клавишей, прежде чем отправить сообщение смены WM_KEYUP. Я сомневаюсь, что это сработает, но вы всегда можете попробовать.

1 голос
/ 09 февраля 2011

Лично я бы использовал SendKey.Send () для этой цели.

Страница MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...