| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > PostMessage в графическое приложение |
| Автор: pomogite 19.4.2012, 17:13 | ||||
| Здравствуйте, подскажите пожалуйста, вот есть код (взят с интернета), он отправляет окну wind нажатие клавиши "1"
Всё работает, клавиша нажимается, даже в свёрнутом окне. Раньше я делала так:
В принципе идентичные коды, но почему не работает второй вариант? Хотелось бы чтобы пользователь мог сам выбрать какую клавишу послать в окно программы. Спасибо. |
| Автор: volvo877 19.4.2012, 17:19 |
| Работает, и отсылает 0 нажатий в окно, как просили. Поэтому ты и не видишь результата. LPARAM для WM_KEYDOWN http://msdn.microsoft.com/en-us/library/windows/desktop/ms646280%28v=vs.85%29.aspx, что содержит... |
| Автор: pomogite 19.4.2012, 17:35 | ||||||
Пишу так -
Не нажимается так
Тыкает однёрку. так нажимает цифру 3, не обращая внимания на wparam - 49
|
| Автор: pomogite 19.4.2012, 18:11 | ||
| В блокноте и калькуляторе да, а вот в игре видимо стоит какая-то защита. Хотя с этим вариантом -
удачно всё отправляется, узнать бы значения - $00000031,$00020001 для других цифр и пробела, энтера. |
| Автор: Чучмек 19.4.2012, 20:14 | ||
Биты 16-23 содержат номер клавиши на клавиатуре http://delphiworld.narod.ru/base/symbol_to_key_scan_code.html |
| Автор: pomogite 19.4.2012, 20:39 | ||
| Ну это понятно, что клавиша 1 это - $00000031 а второе значение? - $00020001 пишу так -
Пробел не нажимается. |
| Автор: Чучмек 19.4.2012, 22:08 |
| lParam=$00390001 не? |
| Автор: pomogite 19.4.2012, 22:36 |
| Да так работает! Спасибо огромное!!! Скажите пожалуйста, как Вы вычислили lParam пробела? И вообще как вычислять для других клавиш. |
| Автор: volvo877 19.4.2012, 22:39 |
| http://ru.wikipedia.org/wiki/%D0%A1%D0%BA%D0%B0%D0%BD-%D0%BA%D0%BE%D0%B4 пробела = $39, посылать 1 раз. |
| Автор: Чучмек 19.4.2012, 22:55 | ||
Скан код можно получить с помощью MapVirtualKey |
| Автор: pomogite 19.4.2012, 22:56 |
| А почему тогда вот эти параметры $00000031,$00020001 посылают единицу? |
| Автор: Чучмек 19.4.2012, 23:03 |
| Скан код "1" - $02 А ansi код "1" - $31 подробней завтра, жена гонит спать. |
| Автор: Чучмек 20.4.2012, 08:20 | ||
| Теперь подробнее, почему в одном случае "1" это (hwn,WM_KEYDOWN, $00000031,0) а в другом (hwn,WM_KEYDOWN, 0,$00020001) Для блокнота не важно, где была нажата единица, важно что это единица а не "!", по этому блокнот использует wParm в котором передается ansi код символа. Для игры важно, что была нажата клавиша "1/!", но не важно, что это "!" или "1", поэтому игра использует скан-код клавиши, который передается в lParam. Вот для примера:
В memo2 будут выводится wParam и lParam при WM_KEYDOWN в memo1 |
| Автор: pomogite 20.4.2012, 10:23 |
| Спасибо большое, ещё раз, что всё понятно объяснили на пальцах! Думаю многим будет полезна данная информация. |