Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не работает сочетание клавиш alt+1 (PostMessage)


GrieVeR-13 ©   (2009-08-06 23:40:00) 

Здраствуйте.
PostMessage(h,WM_SYSKEYDOWN,VK_MENU,0);
PostMessage(h,WM_CHAR,ord('Q'),0);
PostMessage(h,WM_SYSKEYUP,VK_MENU,0);
Работает нормально (посылаю в игру).
но меняю ord('Q') на ord('1') и комбинация отказывается срабатывать.
Помогите найти проблему, пожалуйста.


  (2009-09-08 18:34:00) [1]

Удалено модератором


Leonid Troyanovsky   (2009-08-12 22:42:00) [2]


> Leonid Troyanovsky ©   (12.08.09 22:33) [11]

> AFAIK, сработает такая уловка не позжее секунды после потери

Хотя, если принять [2] безоговорочно, то можно обойтись и без
Attach, простым SetKeyboardState & PostMessage.

--
Regards, LVT.


Leonid Troyanovsky   (2009-08-12 22:33:00) [3]


> GrieVeR-13 ©   (07.08.09 16:13) [2]

> Также я пробовал, если послать просто PostMessage(h,WM_CHAR,
> ord('1'),0); и в этом время держать альт самому - работает

Гм..

Можно испытать AttachThreadInput к целевому потоку и SetKeyboardState
для установки там VK_MENU перед SendMessage(..WM_CHAR, ord('1')..), но,
AFAIK, сработает такая уловка не позжее секунды после потери целевым
потоком фокуса ввода (прям как в той сказке про Золушку).

--
Regards, LVT.


Leonid Troyanovsky   (2009-08-12 22:15:00) [4]


> GrieVeR-13 ©   (12.08.09 21:52) [9]

> на Альт+Нумпад_1 даже в игре не отвечает.

Независимо от нумлока?

Теперь можно впадать в отчаяние - пистолет мы не нашли [ОНО]

Прежде чем пытаться генерировать последовательности из [5]
путем Post(Send)Message предлагаю переобосновать тезис о
невозможности работы с foreground окном исследуемой игры.

--
Regards, LVT.


GrieVeR-13   (2009-08-12 21:52:00) [5]

на Альт+Нумпад_1 даже в игре не отвечает.


KilkennyCat   (2009-08-11 01:59:00) [6]

нумпадность не влияет?


GrieVeR-13   (2009-08-10 23:51:00) [7]

К сожалению, сендинпут только для активного окна. Так что я в безысходном положении.


Leonid Troyanovsky   (2009-08-09 17:42:00) [8]


> GrieVeR-13 ©   (09.08.09 15:40) [5]

> WM_SYSKEYDOWN Dispatched 12h 18d VK_MENU Scan 38h Alt Down
..
> WM_KEYUP Dispatched 12h 18d VK_MENU Scan 38h Up

Не симметричный ответ :)

See SendInput.

--
Regards, LVT.


GrieVeR-13   (2009-08-09 15:40:00) [9]

WM_SYSKEYDOWN Dispatched 12h 18d VK_MENU Scan 38h Alt Down
WM_SYSKEYDOWN Dispatched 31h 49d VK_1 Scan 02h Alt Down
WM_SYSCHAR Dispatched 31h 49d '1' Scan 02h Alt Down
WM_MENUCHAR Sent Closed
WM_KEYUP Dispatched 12h 18d VK_MENU Scan 38h Up
WM_KEYUP Dispatched 31h 49d VK_1 Scan 02h Up

Вот что мне выдал WinSight.
Перепробовал все комбинации с вм_командами. Глухо.


Leonid Troyanovsky   (2009-08-09 08:47:00) [10]


> GrieVeR-13 ©   (09.08.09 03:26) [3]

> важно, может есть другой способ вызвать эту комбинацию?

SendInput, see also [1].

Можно поискать winsight or spy генерируется ли на искомых
комбинациях WM_COMMAND и SendMessage уже оных.

--
Regards, LVT.


GrieVeR-13   (2009-08-09 03:26:00) [11]

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


GrieVeR-13   (2009-08-07 16:13:00) [12]

Но игра прекрасно реагирует на другие комбинации. И только на альт+цифра не получается. (А просто цифра работает).
Также я пробовал, если послать просто PostMessage(h,WM_CHAR,ord('1'),0); и в этом время держать альт самому - работает, а наоборот - (послать альт и затем нажать '1') - нет.


Leonid Troyanovsky   (2009-08-07 09:49:00) [13]


> GrieVeR-13 ©   (06.08.09 23:40)  

> Помогите найти проблему, пожалуйста.

Проблема может быть не одна.

Главная из них в том, что нажатие комбинации клавиш,
как, впрочем, и одиночное нажатие невозможно эмулировать
_точно_ путем Post(Thread/Send)Message. Поэтому, реакция на
оную эмуляцию у разных приложений разная.

Вторая может быть в том, что игра может использовать DirectX,
что может накладывать дополнительные ограничения.

Наиболее точно можно эмулировать нажатия через SendInput
or keybd_event, однако только для foreground потока
(хотя, честно говоря, неактивные приложения и вовсе не
обязаны обрабатывать клавиатурный ввод).

--
Regards, LVT.


Наверх

Титульная страница Поиск, карта сайта Написать письмо