Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Эмуляция клавиш в неактивном приложении


Автор: Romы4 24.7.2009, 07:16
Делал так:

var  wnd: HWND;
wnd := FindWindow('notepad', nil);
PostMessage(wnd, WM_KEYDOWN, VK_F1, 0);

С блокнотом проходит все на ура, даже когда он не активен, не работает правда когда свернут....с другими приложениями работает токо когда они активны.....помогите плиз примером, суть задачи состоит в том чтобы эмулировать нажатие клавишь в свернутом или хотябы не в активном приложении

Автор: Romikgy 24.7.2009, 10:50
простой способ ,
считать состояние окна , запомнить , востановить и сделать его активным выполнить все что нужно и востановить каким было окно ....

Автор: Romы4 24.7.2009, 11:04
это было слишком просто)))....нужно чтобы окно не вызывалось поверх остальных (всегда оставалось неактивным)

Автор: Romikgy 24.7.2009, 11:09
зачем такое?

Автор: Rrader 25.7.2009, 14:25
Есть и обходные пути. Команды меню можно эмулировать через WM_COMMAND, при этом идентификатор можно получить, подсмотрев в сканере окон (InqSoft Window Scanner умеет). 
Код

SendNotifyMessage(NotepadWindowHandle, WM_COMMAND, 64, 0);

Автор: Romы4 1.8.2009, 16:37
Цитата(Rrader @ 25.7.2009,  14:25)
Есть и обходные пути. Команды меню можно эмулировать через WM_COMMAND, при этом идентификатор можно получить, подсмотрев в сканере окон (InqSoft Window Scanner умеет). 
Код

SendNotifyMessage(NotepadWindowHandle, WM_COMMAND, 64, 0);

это прекрасно пашет с блокнотом.....но с другими приложениями не работает.......

Я сделал так как мне посоветовал Romikgy -т.е. брал фокус нужного мне окна, посылал в него необходимое нажатие клавиатуры, затем возвращал фокус текущему окну.....НО создалась новая проблема, так как мне надо постоянно с интервалом 1-5 секунд посылать нажатие клавиатуры-возникло мерцание окон из-за постоянного смены фокуса........помогите как можно от этого избавится  smile 

Автор: Rrader 1.8.2009, 17:29
Цитата(Romы4 @  1.8.2009,  22:37 Найти цитируемый пост)
это прекрасно пашет с блокнотом.....но с другими приложениями не работает.......

Разумеется, для каждого приложения нужно смотреть, что подставлять в параметры. А как это делать, я написал уже smile 

Автор: Romы4 1.8.2009, 17:39
а можно подробнее про параметры SendNotifyMessage...я имею в виду цифры

Автор: Rrader 1.8.2009, 18:00
В аттаче

Автор: Romы4 1.8.2009, 18:33
с этим я разобрался...но все равно спасибо большое.....но в сканере я так и ненашел где он отображает горячие клавиши

Добавлено через 13 минут и 25 секунд
я так понял что для горячих клавишь синтаксис такой:
SendNotifyMessage(NotepadWindowHandle, WM_HOTKEY, 64, 0);.............но как сканер отображает id кнопок я не нашел

Автор: Rrader 2.8.2009, 06:17
Ничего Вы не поняли, поэтому перечитайте всю тему внимательно от начала до конца и попробуйте понять еще раз. Не выйдет - бросайте это дело.

Автор: Romы4 2.8.2009, 09:45
Ого поммог))))....если все следовали Вашему совету и бросали на полдороги....хммм-мы бы наверное еще на ветках сидели

Автор: Yanis 5.8.2009, 11:23
Romы4
Да зачем тебе горячие клавиши-то? Тем более, что они есть не у всех пунктов меню.
У тебя есть идентификатор пункта меню (узнаёшь чеоез s0m Windows Scanner) и ты его программно «нажимаешь», если так можно выразиться.

П. С. Скорее, мы сидели бы на ветках, если бы вопрошающий не слышал ответа.

Автор: Romы4 31.8.2009, 07:31
Ребят, спасибо вроде разобрался.....с любым окном получается кроме d3d приложения-на него фокус надо обязательно..можно конечно брать хэндл активного окна потом брать в фокус нужное d3d приложение нажимать в нем нужные клавиши и возвращать фокус на предыдущее окно-это единственный способ который я нашел....но от вызывает мерцание между окнам+пока d3d в фокусе не возможно с другим окном работать...а нужно именно так

Автор: 0LineGate 21.10.2009, 09:13
Цитата(Romы4 @ 31.8.2009,  07:31)
Ребят, спасибо вроде разобрался.....с любым окном получается кроме d3d приложения-на него фокус надо обязательно..можно конечно брать хэндл активного окна потом брать в фокус нужное d3d приложение нажимать в нем нужные клавиши и возвращать фокус на предыдущее окно-это единственный способ который я нашел....но от вызывает мерцание между окнам+пока d3d в фокусе не возможно с другим окном работать...а нужно именно так

Код

 SendMessage(Handle, WM_KEYDOWN, KeyId, 0);
 SendMessage(Handle, WM_KEYUP, KeyId, 0);

Так и с d3d приложениями должно работать, я думаю.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)