Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2018.11.04;
Скачать: CL | DM;

Вниз

передача нажатия клавиши стороннему приложению   Найти похожие ветки 

 
lewka ©   (2016-09-15 13:46) [0]

Здравствуйте, мастера программирования.
Передаю нажатие клавиш браузеру вот так
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);


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


 
Leonid Troyanovsky ©   (2016-09-15 16:54) [1]


> lewka ©   (15.09.16 13:46)

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

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

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

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

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

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

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2016-09-15 17:29) [2]


> 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.


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

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


 
Leonid Troyanovsky ©   (2016-09-16 09:14) [4]


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

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

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

--
Regards,  LVT.


 
Dimka Maslov ©   (2016-09-17 12:08) [5]


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


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



Страницы: 1 вся ветка

Текущий архив: 2018.11.04;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.004 c
2-1473395811
Abcdef123
2016-09-09 07:36
2018.11.04
Использование CreateProcess. Как показать нужную форму после


2-1473182108
Drowsy
2016-09-06 20:15
2018.11.04
Вопрос по TTreeView.


2-1474184193
Алекс Серов
2016-09-18 10:36
2018.11.04
Как открыть таблицу Эксель под паролем?


2-1473404951
валя
2016-09-09 10:09
2018.11.04
Указатели


2-1474206922
KropotkinGosha
2016-09-18 16:55
2018.11.04
Не выполняется код в функции