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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В 100-й раз про эмуляцию нажатия клавиш, Подробнее внутри 
V
    Опции темы
EKoshelev
Дата 28.8.2013, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Короче, во всех примерах нажатие клавиш можно сообщать конкретному приложению или даже конкретному элементу управления. А можно ли сделать так, чтобы нажатия славливали те приложения, которые в данный момент активны? Как в реальной жизни: жму я клавишу "A" на клавиатуре, а на неё реагирует то приложение, которое в данный момент активно.

Если это проблематично в Delphi, то возможно есть какой-нибудь другой инструмент?

Заранее спасибо.


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


НЭТ БИЛЭТ
**


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

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



GetForegroundWindow 


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


Опытный
**


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

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



Вот если Excel активен, то работает, а если, например, блокнот, то не пашет.


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


НЭТ БИЛЭТ
**


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

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



Код

var
  hw,
  ht:cardinal;
  gtinfo:TGUIThreadinfo;
begin
  hw:=GetForegroundWindow();
  ht:=GetWindowThreadProcessId(hw,nil);
  FillChar(gtinfo,sizeof(gtinfo),0);
  gtinfo.cbSize:=sizeof(gtinfo);
  GetGUIThreadInfo(ht,gtinfo);
  caption:=inttohex(gtinfo.hwndActive,8)+' '+inttohex(gtinfo.hwndFocus,8);


Погугли по функциям.


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


Эксперт
****


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

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



SendInput же


--------------------
Обижено школьников: 8
PM MAIL   Вверх
EKoshelev
Дата 29.8.2013, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Чучмек, спасибо, в приведённом тобой примере подходит этот хэндл: gtinfo.hwndFocus. Правда, опять-таки не ко всему. То что предложил bems канает везде. По крайней мере из того, что я тестил.


bems, спасибо.

Нашел вот такой код:

Код

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Inp: TInput;

begin
  // press
  Inp.Itype := INPUT_KEYBOARD;
  Inp.ki.wVk := Ord('A');
  Inp.ki.dwFlags := 0;
  SendInput(1, Inp, SizeOf(Inp));

  // release
  Inp.Itype := INPUT_KEYBOARD;
  Inp.ki.wVk := Ord('A');
  Inp.ki.dwFlags := KEYEVENTF_KEYUP;
  SendInput(1, Inp, SizeOf(Inp));
  Application.ProcessMessages;
end;



Пашет вроде. Правда ещё не проверил в World of Tanks. 


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


НЭТ БИЛЭТ
**


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

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



Да, конечно, bems прав. 
Я зациклился на 
Цитата(EKoshelev @  28.8.2013,  13:16 Найти цитируемый пост)
 можно сообщать конкретному приложению или даже конкретному элементу управления

и даже прочитал "можно сообщать", как "можно отправить сообщение".
Поэтому и ответ мой - как найти "этот самый" активный элемент. 
Мне минус.


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


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


Эксперт
****


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

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



Цитата(EKoshelev @  29.8.2013,  09:01 Найти цитируемый пост)
World of Tanks
для игр может понадобиться отправлять нажатия в сканкодах



--------------------
Обижено школьников: 8
PM MAIL   Вверх
EKoshelev
Дата 30.8.2013, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



bems, вот с этого места, если не трудно, по подробнее. Т. к. весь замут как раз ради этого. Вчерась попробовал в WoT передавать нажатия - не чухает совсем. Если таки трудно, то буду рад хотя бы ссылкам на какие-нибудь полезные источники.


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
bems
Дата 30.8.2013, 07:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



вот тут я писал вариант на сях

Добавлено через 1 минуту и 28 секунд
вопрошающий был удовлетворён, хотя потом в этой теме появился человек, который сказал что у него не работает. попробуй короч


--------------------
Обижено школьников: 8
PM MAIL   Вверх
EKoshelev
Дата 3.9.2013, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Короче, всем спасибо (не прошло и полгода, ага).

Вот кусок кода, которым я генерю нажатие клавиш:

Код

var
  Inp: TInput;

...

begin
  FillChar(Inp, sizeof(Inp), 0);
  Inp.Itype := INPUT_KEYBOARD;

  // В сишном варианте была константа KEYEVENTF_SCANCODE, но в дельфовом я такой не нашел, просто выяснил, что она равна 8.
  // Это нажатие.
  Inp.ki.dwFlags := 8 or 0;//KEYEVENTF_SCANCODE or 0;
  // Это отжатие (его ещё не тестил, если чо)
  // Inp.ki.dwFlags := 8 or KEYEVENTF_KEYUP;

  // Это скан-код клавиши "A" (у меня, у вас может быть другой)
  Inp.ki.wScan := $1E;

  // Собственно эмуляция нажатия
  SendInput(1, Inp, SizeOf(Inp));
end;





Вот нехитрый код, при помощи которого можно поузнавать скан-коды клавиш:

Код

...
  public
    { Public declarations }

    procedure WmKeyDown(var Msg: TMessage); message wm_KeyDown;
  end;

...

procedure TForm1.WmKeyDown(var Msg: TMessage);
begin
  Label1.Caption := '0x' + IntToHex(Msg.LParamHi and $FF, 2);
  Label3.Caption := IntToStr(Msg.WParam);
end;


В первую лабель выводится скан-код в хексе, в третью ASCII. Про скан-код я в вики узнал кой-чего, чего раньше не знал.
Короче, по любому всем спасибо. Особенно bemsу.


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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