Каким будет рабочее значение lParam (низкие / высокие ключи) в PostMessage? (Выигрышные функции)

Я уже видел около 20 вопросов (здесь @ stackOverflow), но по какой-то причине я не получаю большинство ответов, которые они подходят. Некоторые говорят, что понимают, но в моем случае я не вижу ни одного рабочего кода.

Я пытался отправить ключи в игры (окно переднего плана) как макрос, и я видел, как lParam в: PostMessage (handle, WM_KEYDOWN , (uint) key, 0); действительно имеет значение; по словам людей в сети (они говорят, но не показывают код / ​​пример). Впервые использую функции выигрыша, поэтому я немного не понимаю, как заставить их работать с некоторыми играми; скажем «Лига легенд» или «Team Fortress 2».

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

Заранее спасибо и извините за мою нубизму с функциями выигрыша.

Искренне,

Армандо Леон


person Armando    schedule 27.06.2011    source источник
comment
Прочтите перед продолжением: blogs.msdn.com /b/oldnewthing/archive/2005/05/30/423202.aspx   -  person Mike Caron    schedule 27.06.2011
comment
PostMessage не может работать, нельзя контролировать состояние клавиатуры (клавиши Shift, Alt, Ctrl). Вместо этого используйте SendInput ().   -  person Hans Passant    schedule 27.06.2011


Ответы (4)


Лучше всего использовать документацию для WM_KEYDOWN.

person agent-j    schedule 27.06.2011
comment
Спасибо за документацию (+1), но хотя я использовал 0 в качестве lParam, он не будет работать в играх, даже если они отправят его в окно чата. В чем причина? Это может быть проблема lParam? O игры, блокирующие любое взаимодействие с внешними приложениями? - person Armando; 27.06.2011

Чтобы узнать, что содержит lParam, перейдите по этой ссылке: http://msdn.microsoft.com/en-us/library/ms646280(v=vs.85).aspx. Если вы просто передадите wParam и 0 для lParam, это может сработать для игр, которые используют только виртуальный ключевой код (содержащийся в wParam), но не в играх, которые используют, например, код сканирования (переданный в lParam).

Что вы можете сделать, так это написать служебную программу, которая распечатывает wParam и lParam для нажатия клавиши (и любых других событий (wm_char, wm_keyup и т. Д.), Которые вы хотите отправить в игру). Затем вы можете использовать его, чтобы получить wParam и lParam для любой комбинации клавиш, которую вы хотите, а затем, если вы передадите его в любую игру, он должен работать. Передача всех правильных значений - единственный способ убедиться, что он будет работать во всех случаях.

person devsh    schedule 27.06.2011

Вы не можете подделать ввод с помощью PostMessage(). Вместо этого вам нужно использовать SendInput().

person David Heffernan    schedule 27.06.2011

Я знаю, что это старая ветка, но я не могу позволить кому-то сказать: «Вы не можете подделать ввод с помощью PostMessage ()». Эта ветка отображается в Google, когда мы ищем «как изменить сообщение lparam postmessage».

Представим, что мне нужно отправить клавишу Enter в другую программу: я использую Spy ++ и физически нажимаю на клавишу, которая мне нужна, чтобы проверить, какая константа мне нужна и какие значения lParam мне нужны. (для подтверждения вы также можете проверить здесь http://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspx)
Проверяйте нажатие клавиши, а не ее нажатие.

Итак, если мне нужна клавиша Enter с cRepeat: 1 Scancode: 29 fExtended: 0 AltDown: 0 fRepeat: 0 fUp: 0,

Мне придется изменить 32 бита lParam, мне нужно понять массив здесь http://msdn.microsoft.com/en-us/library/ms646280%28v=vs.85%29.aspx

биты такие: 31 .... 3 2 1 0

Мне нужно 1 для cRepeat, поэтому: 0000 0000 0000 0001 (биты от 0 до 15, как в массиве)

Мне нужно 29 (в шестнадцатеричном формате) для Scancode, поэтому: 0010 1001 (биты с 16 по 23)

остальное на нуле

Теперь я просто перегруппирую lparam (в двоичном формате), который мне нужен: 0010 1001 0000 0000 0000 0001

И я преобразовываю его в шестнадцатеричный: 290001

Итак, теперь в моей программе он будет работать, если я использую: PostMessage (hWnd, WM_KEYDOWN, VK_RETURN, 0x290001);

Надеюсь, это поможет людям, которые приходят сюда, как я :)

Себ,

person SebSeb    schedule 21.07.2014