Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PostMessage в графическое приложение, различные варианты написания PostMessage 
V
    Опции темы
pomogite
  Дата 19.4.2012, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 24.3.2006

Репутация: нет
Всего: нет



Здравствуйте,
подскажите пожалуйста, вот есть код (взят с интернета), он отправляет окну wind нажатие клавиши "1"
Код

PostMessage(FindWindow(nil,(PAnsiChar(wind))),WM_KEYDOWN,$00000031,$00020001);

Всё работает, клавиша нажимается, даже в свёрнутом окне.
Раньше я делала так: 
Код

PostMessage(FindWindow(nil,(PAnsiChar(wind))),WM_KEYDOWN,49,0);

В принципе идентичные коды, но почему не работает второй вариант?
Хотелось бы чтобы пользователь мог сам выбрать какую клавишу послать в окно программы.
Спасибо.


PM MAIL   Вверх
volvo877
Дата 19.4.2012, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 5
Всего: 116



Цитата(pomogite @  19.4.2012,  16:13 Найти цитируемый пост)
почему не работает второй вариант?
Работает, и отсылает 0 нажатий в окно, как просили. Поэтому ты и не видишь результата. LPARAM для WM_KEYDOWN посмотри, что содержит...
PM MAIL   Вверх
pomogite
  Дата 19.4.2012, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 24.3.2006

Репутация: нет
Всего: нет



Пишу так - 
Код

PostMessage(FindWindow(nil,(PAnsiChar(wind))),WM_KEYDOWN,49,1);

Не нажимается
так
Код

PostMessage(FindWindow(nil,(PAnsiChar(wind))),WM_KEYDOWN,49,$00020001);

Тыкает однёрку. 
так нажимает цифру 3, не обращая внимания на wparam - 49
Код

PostMessage(FindWindow(nil,(PAnsiChar(wind))),WM_KEYDOWN,49,$00040001);

PM MAIL   Вверх
volvo877
Дата 19.4.2012, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 5
Всего: 116



Цитата(pomogite @  19.4.2012,  16:35 Найти цитируемый пост)
Пишу так - 
PostMessage(FindWindow(nil,(PAnsiChar(wind))),WM_KEYDOWN,49,1);
Не нажимается
Странно, проверил на Блокноте - нажимается, 1 печатается. Равно как и в следующих двух вариантах.

PM MAIL   Вверх
pomogite
Дата 19.4.2012, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 24.3.2006

Репутация: нет
Всего: нет



В блокноте и калькуляторе да, а вот в игре видимо стоит какая-то защита.
Хотя с этим вариантом - 
Код

PostMessage(FindWindow(nil,(PAnsiChar(wind))),WM_KEYDOWN,$00000031,$00020001);

удачно всё отправляется, узнать бы значения - $00000031,$00020001 для других цифр и пробела, энтера.

Это сообщение отредактировал(а) pomogite - 19.4.2012, 19:23
PM MAIL   Вверх
Чучмек
Дата 19.4.2012, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



Цитата

lParam

    The repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown following.
    Bits    Meaning
    0-15    The repeat count for the current message. The value is the number of times the keystroke is autorepeated as a result of the user holding down the key. If the keystroke is held long enough, multiple messages are sent. However, the repeat count is not cumulative.
    16-23    The scan code. The value depends on the OEM.
    24    Indicates whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0.
    25-28    Reserved; do not use.
    29    The context code. The value is always 0 for a WM_KEYDOWN message.
    30    The previous key state. The value is 1 if the key is down before the message is sent, or it is zero if the key is up.
    31    The transition state. The value is always 0 for a WM_KEYDOWN message.

     



Биты 16-23 содержат номер клавиши на клавиатуре
http://delphiworld.narod.ru/base/symbol_to..._scan_code.html


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
pomogite
Дата 19.4.2012, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 24.3.2006

Репутация: нет
Всего: нет



Ну это понятно, что клавиша 1 это - $00000031
а второе значение? - $00020001
пишу так - 
Код

PostMessage(FindWindow(nil,(PAnsiChar(wind))),WM_KEYDOWN,$00000020,$00020001);

Пробел не нажимается.
PM MAIL   Вверх
Чучмек
Дата 19.4.2012, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



lParam=$00390001 не?


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
pomogite
Дата 19.4.2012, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 24.3.2006

Репутация: нет
Всего: нет



Да так работает! Спасибо огромное!!! Скажите пожалуйста, как Вы вычислили lParam пробела? И вообще как вычислять для других клавиш.
PM MAIL   Вверх
volvo877
Дата 19.4.2012, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 5
Всего: 116



Скан-код пробела = $39, посылать 1 раз. smile
PM MAIL   Вверх
Чучмек
Дата 19.4.2012, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



Код

lParam:=((ScanCode and $000000FF) shl 16) or (count and $0000FFFF )

Скан код можно получить с помощью MapVirtualKey 

Это сообщение отредактировал(а) Чучмек - 19.4.2012, 22:56


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
pomogite
Дата 19.4.2012, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 24.3.2006

Репутация: нет
Всего: нет



А почему тогда вот эти параметры $00000031,$00020001 посылают единицу? 
PM MAIL   Вверх
Чучмек
Дата 19.4.2012, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



Скан код "1" - $02
А ansi код "1" - $31

подробней завтра, жена гонит спать. smile  


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Чучмек
Дата 20.4.2012, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



Теперь подробнее, почему в одном случае "1" это (hwn,WM_KEYDOWN, $00000031,0) а в другом (hwn,WM_KEYDOWN, 0,$00020001)
Для блокнота не важно, где была нажата единица, важно что это единица а не "!", по этому блокнот использует wParm в котором передается ansi код символа.
Для игры важно, что была нажата клавиша "1/!", но не важно, что это "!" или "1", поэтому игра использует скан-код клавиши, который передается в  lParam.
Вот для примера:
Код

var owp:pointer;
function nwp(h,m,w,l:cardinal):cardinal;stdcall;
begin
if m=WM_KEYDOWN then form1.Memo2.Lines.Add(inttohex(w,8)+'  '+inttohex(l,8));
CallWindowProc(owp,h,m,w,l);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
integer(owp):=getwindowlong(memo1.Handle,GWL_WNDPROC);
setwindowlong(memo1.Handle,GWL_WNDPROC,integer(@nwp));
end;
 
В memo2 будут выводится wParam и lParam при WM_KEYDOWN в memo1


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
pomogite
Дата 20.4.2012, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 24.3.2006

Репутация: нет
Всего: нет



Спасибо большое, ещё раз, что всё понятно объяснили на пальцах! Думаю многим будет полезна данная информация.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0803 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.