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

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

передача нажатия клавиши стороннему приложению [D7, XP]


lewka ©   (2016-09-15 13:46:00) 

Здравствуйте, мастера программирования.
Передаю нажатие клавиш браузеру вот так
h := findwindow( nil,'Google - Google Chrome',);
SetForegroundWindow(h);
keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event(72, 0, 0, 0);
keybd_event(72, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);


Но это работает только если это окно активно.
Подскажите как передать не активному окну?


Dimka Maslov   (2016-09-17 12:08:00) [1]


> не всегда сработают даже в Блокноте.


Ровно как и предложенный автором способ


Leonid Troyanovsky   (2016-09-16 09:14:00) [2]


> Dimka Maslov ©   (15.09.16 21:30) [3]

> Напрямую слать WM_KEYDOWN и WM_KEYUP?

Посылка комбинаций клавиш путем различных сочетаний
PostMessage & SendMessage, даже с подключением AttachThreadInput,
не всегда сработают даже в Блокноте.

--
Regards,  LVT.


Dimka Maslov   (2016-09-15 21:30:00) [3]

Напрямую слать WM_KEYDOWN и WM_KEYUP?


Leonid Troyanovsky   (2016-09-15 17:29:00) [4]


> Leonid Troyanovsky ©   (15.09.16 16:54) [1]

Самый простой вариант руками сделать хром foreground,
затем запустить или вывести свое приложение foreground
и там сделать что-то вроде:

procedure TForm1.Button1Click(Sender: TObject);
begin
 Visible := False;
 h := findwindow( nil,'Google - Google Chrome',);
 if h = GetForegroundWindow then
  begin
    keybd_event(VK_CONTROL, 0, 0, 0);
    keybd_event(72, 0, 0, 0);
    keybd_event(72, 0, KEYEVENTF_KEYUP, 0);
    keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
 end;
 Visible := True;
end;

--
Regards, LVT.


Leonid Troyanovsky   (2016-09-15 16:54:00) [5]


> lewka ©   (15.09.16 13:46)

> работает только если это окно активно.Подскажите как передать
> не активному окну?

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

Бо, все "нажатия" клавиш будут направляться foreground окну.

Пока вижу 2 варианта реализации клавиатурных макросов:
1. Посылатель не забирает фокус у целевого приложения.
Это возможно, если посылатель  генерирует последовательность
нажатий _не получая_ фокус. Это можно сделать, например,
по нажатию на горячую клавишу, зарегистрированную в системе,
по таймеру и т.д.

2. Посылатель определяет foreground поток, просит его активировать
нужное окно, генерирует нажатия, дожидается окончания обработки,
просит foreground поток вернуть фокус на начальное окно.

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

--
Regards, LVT.


Наверх

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