1 / 1 / 0
Регистрация: 03.02.2012
Сообщений: 11
1

Эмуляция нажатия клавиш для неактивного/свёрнутого приложения.

03.02.2012, 08:09. Показов 11216. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть большое желание написать что-то наподобии программы-макроса, которая будет отправлять или эмулировать нажатие клавиш для нужного свёрнутого приложения.

Собственно хочется написать что-то наподобии бота для одной игры, чтобы этот "бот" работал в фоновом режиме и эмулировал нажатие клавиш для неактивного или даже свёрнутого окна (в зависимости что проще), при этом подопытная программа распознавала посылаемые команды, как действия аналогичные физическому нажатию на клавиши клавиатуры.

Какие команды или процедуры могут в этом помочь? И хотелось бы увидеть примеры их использования на примере нажатия клавиши "Пробел", так как в описании команд зачастую нет реального примера.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.02.2012, 08:09
Ответы с готовыми решениями:

Эмуляция нажатия стрелок для неактивного запущенного приложения
Да, я видел, похожая тема уже есть https://www.cyberforum.ru/delphi-beginners/thread440043.html...

Эмуляция нажатия клавиш для другого приложения (Win10 Под D3D) не работает
Добрый день! У меня такая трабла возникла. Нужно В игре под директ3Д зажать правую кнопку мышки на...

Эмуляция нажатия клавиш
помогите с кодом разобраться, не работает( Var PWD, Login : String; procedure...

Эмуляция нажатия клавиш
Всем привет! Помогите написать простенькую программу. Что должна делать? Вводим число в Edit (в...

4
660 / 530 / 137
Регистрация: 07.07.2011
Сообщений: 1,232
03.02.2012, 15:53 2
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean);
type TShiftKeyInfo = record
    shift: Byte;
    vkey: Byte;
  end;
  byteset = set of 0..7;
const shiftkeys: array[1..3] of TShiftKeyInfo = ((shift: Ord(ssCtrl);
    vkey: VK_CONTROL), (shift: Ord(ssShift); vkey: VK_SHIFT), (shift: Ord(ssAlt); vkey: VK_MENU));
 
var flag: DWORD;
  bShift: ByteSet absolute shift;
  i: Integer;
begin
  for i := 1 to 3 do
    if shiftkeys[i].shift in bShift then keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), 0, 0);
  if specialkey then
    flag := KEYEVENTF_EXTENDEDKEY
  else
    flag := 0;
  keybd_event(key, MapvirtualKey(key, 0), flag, 0);
  flag := flag or KEYEVENTF_KEYUP;
  keybd_event(key, MapvirtualKey(key, 0), flag, 0);
  for i := 3 downto 1 do
    if shiftkeys[i].shift in bShift then keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), KEYEVENTF_KEYUP, 0);
end;
Чтобы воспользоваться этой процедурой надо предварительно найти и активизировать нужное окно:

SetForegroundWindow(FindWindow(PChar(WindowClassName), PChar(WindowCaption)));

PS. не забудьте поставить задержки типа Sleep(100) после активизации окна и между посылаемыми клавишами, не то окно может не успевать реагировать на клавиши...

Автор ответа: Vit
Взято с Vingrad.ru

Или

Delphi
1
2
3
4
if FindWindow(nil, 'Безымянный - Блокнот') <> 0 then
  ShowMessage('Окно найдено')
else
  ShowMessage('Окно НЕнайдено');
Delphi
1
2
3
4
5
6
7
var
  h: HWND;
begin
  h := findwindow(nil, 'Безымянный - Блокнот');
  if h <> 0 then
    SetWindowPos(h, HWND_BOTTOM, 1, 1, 20, 20, swp_nosize);
end;
0
1 / 1 / 0
Регистрация: 03.02.2012
Сообщений: 11
03.02.2012, 16:08  [ТС] 3
В этом случае окно активируется? Если да, то нужно чтобы окно было в свёрнутом состаянии и не активировалось, и пользователь мог бы спокойно работать с другими приложениями. Так как скрипт который работает на активном приложении уже есть, нужен подобный функционал для неактивного/свёрнутого.

Тоесть имя приложения которому посылать эмуляцию должно описываться ручками прям в коде (неизменно), а не улавливать последнее активное приложение...
0
660 / 530 / 137
Регистрация: 07.07.2011
Сообщений: 1,232
03.02.2012, 16:13 4
Во первых если делать последним способом

Цитата Сообщение от Дмитрий3241 Посмотреть сообщение
Delphi
1
2
3
4
if FindWindow(nil, 'Безымянный - Блокнот') <> 0 then
  ShowMessage('Окно найдено')
else
  ShowMessage('Окно НЕнайдено');
Delphi
1
2
3
4
5
6
7
var
  h: HWND;
begin
  h := findwindow(nil, 'Безымянный - Блокнот');
  if h <> 0 then
    SetWindowPos(h, HWND_BOTTOM, 1, 1, 20, 20, swp_nosize);
end;
То приложение не будет активным, но имя окна придеться писать в коде ручками, для того что бы получить его дескриптор и далее с ним работать, а вообще если интересно то вот:
http://tinyurl.com/7ylpd45
1
1 / 1 / 0
Регистрация: 03.02.2012
Сообщений: 11
06.02.2012, 06:06  [ТС] 5
Задача сводится к следующему, требуется отправлять уже заранее известные клавиши уже известному приложению, собственно проблема в том, что я не знаком с синтаксисом подобных команд, а без комментариев в предоставленном коде трудно понять, за что отвечает команда/процедура.

Собственно требуется посылать приложению нажатие клавиш ряда F1-F12, ESC, Enter и некоторые буквы. Сам алгоритм, в каком порядке, что посылать, и через какое время – есть. К сожалению, моих познании недостаточно, для того, чтобы я мог послать неактивному приложению какую-нибудь нажатую клавишу. Поэтому и попросил пример кода. Например, как отправить тому же неактивному Notepad'у «Пробел», букву "А" и Enter?
0
06.02.2012, 06:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.02.2012, 06:06
Помогаю со студенческими работами здесь

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

Эмуляция нажатия клавиш в неактивное окно.
Здравствуйте. Можно как-то отправить нажите клавиши в неактивное D3D окно, если известно только...

Эмуляция нажатия клавиш в неактивном окне (Игра)
Пытаюсь передать в игру нажатие клавиши F1, но ничего не получается. Пробовал разные способы,...

Эмуляция нажатия клавиш для SDL
Столкнулся с такой проблемой что на эмуляцию нажатия клавиш, SDL не реагирует. Точнее DOSBox....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru