Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
4 / 4 / 3
Регистрация: 20.06.2016
Сообщений: 19
1

Эмуляция нажатия клавиш в неактивном окне (Игра)

20.06.2016, 13:24. Показов 5509. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пытаюсь передать в игру нажатие клавиши F1, но ничего не получается. Пробовал разные способы, перерыл множество форумов, но результата никакого. Есть подозрение что игра блокирует всю эмуляцию, за исключением проверенных программ фирм компьютерной периферии. Один из кодов скидываю под спойлер. Есть у кого какие мысли решения данной задачи?
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
const
 
  ExtendedKeys: set of Byte = [ // incomplete list
  VK_INSERT, VK_DELETE, VK_HOME, VK_END, VK_PRIOR, VK_NEXT,
    VK_LEFT, VK_UP, VK_RIGHT, VK_DOWN, VK_NUMLOCK
    ];
 
procedure SimulateKeyDown(Key: byte);
var
 
  flags: DWORD;
begin
 
  if Key in ExtendedKeys then
    flags := KEYEVENTF_EXTENDEDKEY
  else
    flags := 0;
  keybd_event(Key, MapVirtualKey(Key, 0), flags, 0);
end;
 
procedure SimulateKeyUp(Key: byte);
var
 
  flags: DWORD;
begin
 
  if Key in ExtendedKeys then
    flags := KEYEVENTF_EXTENDEDKEY
  else
    flags := 0;
  keybd_event(Key, MapVirtualKey(Key, 0), KEYEVENTF_KEYUP or flags, 0);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
SetActiveWindow(<хэндл нужного окна>);
SimulateKeyDown(VK_F1);
sleep(100);
SimulateKeyUp(VK_F1);
end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.06.2016, 13:24
Ответы с готовыми решениями:

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

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

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

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

19
49 / 49 / 34
Регистрация: 16.02.2016
Сообщений: 277
20.06.2016, 19:34 2
посмотри здесь https://www.cyberforum.ru/post9288267.html
0
4 / 4 / 3
Регистрация: 20.06.2016
Сообщений: 19
21.06.2016, 07:08  [ТС] 3
Не вариант.
0
2595 / 853 / 75
Регистрация: 21.04.2013
Сообщений: 6,766
21.06.2016, 07:32 4
Название игры?

Цитата Сообщение от Sakuzo Посмотреть сообщение
исключением проверенных программ фирм компьютерной периферии
Они по-другому работают, по "железу".
0
4 / 4 / 3
Регистрация: 20.06.2016
Сообщений: 19
21.06.2016, 07:52  [ТС] 5
Black Desert
0
49 / 49 / 34
Регистрация: 16.02.2016
Сообщений: 277
21.06.2016, 17:48 6
Цитата Сообщение от Sakuzo Посмотреть сообщение
Один из кодов скидываю
код этот работает, только нужно было вместо
Цитата Сообщение от Sakuzo Посмотреть сообщение
SetActiveWindow(<хэндл нужного окна>);
вызвать
Delphi
1
SetForegroundWindow(Wnd);
процедурка такая получилась
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.Button1Click(Sender: TObject);
var wnd:hwnd;
begin
  wnd:=FindWindow(nil,PChar(Edit1.Text));
  Label1.Caption := IntToStr(wnd);
  if wnd<>0 then
    begin
      SetForegroundWindow(Wnd);
      SimulateKeyDown(VK_F1);
      sleep(100);
      simulateKeyUp(VK_F1);
    end;
end;
код срабатывает как на названии окна, так и на название программы
результат проверки работы программы:
Миниатюры
Эмуляция нажатия клавиш в неактивном окне (Игра)   Эмуляция нажатия клавиш в неактивном окне (Игра)  
0
4 / 4 / 3
Регистрация: 20.06.2016
Сообщений: 19
21.06.2016, 19:17  [ТС] 7
Но не работает в Google Chrome, окно активным становится, а справка не вызывается.
0
49 / 49 / 34
Регистрация: 16.02.2016
Сообщений: 277
21.06.2016, 19:33 8
в мозилле справка по F1 тоже не вызывается, потому что не предусмотрен вызов справки по F1, а в хроме не знаю, я им не пользуюсь
Миниатюры
Эмуляция нажатия клавиш в неактивном окне (Игра)  
0
49 / 49 / 34
Регистрация: 16.02.2016
Сообщений: 277
21.06.2016, 20:13 9
в опере 12.10 открывает вкладку справка
Миниатюры
Эмуляция нажатия клавиш в неактивном окне (Игра)  
0
4 / 4 / 3
Регистрация: 20.06.2016
Сообщений: 19
21.06.2016, 21:03  [ТС] 10
Нужно будет попробовать на опере, в игре точно ничего не происходит, возможно нужно как-то через драйвер, но думаю это сложно.
0
49 / 49 / 34
Регистрация: 16.02.2016
Сообщений: 277
21.06.2016, 21:32 11
здесь главное нужно правильно определить название окна
Миниатюры
Эмуляция нажатия клавиш в неактивном окне (Игра)  
0
4 / 4 / 3
Регистрация: 20.06.2016
Сообщений: 19
21.06.2016, 21:38  [ТС] 12
Ну так да, всё норм, хэндл окна определяет и переводит его в активное, но F1 так и не нажимает =( (в Chrome)
0
49 / 49 / 34
Регистрация: 16.02.2016
Сообщений: 277
21.06.2016, 23:02 13
Цитата Сообщение от Sakuzo Посмотреть сообщение
но F1 так и не нажимает =( (в Chrome)
Sakuzo, специально для тебя установил себе хром и проверил, все работает:
Миниатюры
Эмуляция нажатия клавиш в неактивном окне (Игра)  
0
4 / 4 / 3
Регистрация: 20.06.2016
Сообщений: 19
22.06.2016, 04:43  [ТС] 14
Скинь свой проект, гляну в чём у меня ошибка...
0
49 / 49 / 34
Регистрация: 16.02.2016
Сообщений: 277
22.06.2016, 17:41 15
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
const
 ExtendedKeys: set of Byte = [VK_INSERT, VK_DELETE, VK_HOME,
   VK_END, VK_PRIOR, VK_NEXT, VK_LEFT, VK_UP, VK_RIGHT, VK_DOWN,
   VK_NUMLOCK];
var
  Form1: TForm1;
implementation
 
{$R *.dfm}
 
procedure SimulateKeyDown(Key:byte);
var flags:DWORD;
begin
  if Key in ExtendedKeys then
    flags:=KEYEVENTF_EXTENDEDKEY
  else
    flags:=0;
  keybd_event(Key,MapVirtualKey(Key,0),flags,0);
end;
 
procedure SimulateKeyUp(Key:byte);
var flags:DWORD;
begin
  if Key in ExtendedKeys then
    flags:=KEYEVENTF_EXTENDEDKEY
  else
    flags:=0;
  keybd_event(Key,MapVirtualKey(Key,0),KEYEVENTF_KEYUP or flags,0);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var wnd:hwnd;
begin
  wnd:=FindWindow(nil,PChar(Edit1.Text));
  Label1.Caption := IntToStr(wnd);
  if wnd<>0 then
    begin
      SetForegroundWindow(Wnd);
      SimulateKeyDown(VK_F1);
      sleep(100);
      simulateKeyUp(VK_F1);
    end;
end;
 
end.
0
4 / 4 / 3
Регистрация: 20.06.2016
Сообщений: 19
22.06.2016, 19:22  [ТС] 16
Всё равно ничего не работает, видос записал...
https://cloud.mail.ru/public/FaKR/V8qh2Vd9Q
0
49 / 49 / 34
Регистрация: 16.02.2016
Сообщений: 277
22.06.2016, 20:31 17
суть работы программы уже была озвучена
Цитата Сообщение от VyachNik Посмотреть сообщение
здесь главное нужно правильно определить название окна
программа ищет название окна, если находит, то происходит нажатие F1;
в браузерах название окна меняется и зависит от открытой и в данный момент активной страницы, у которой, обычно, в парном теге <title>название окна</title>, находится название окна
программа нормально работает
Миниатюры
Эмуляция нажатия клавиш в неактивном окне (Игра)  
0
4 / 4 / 3
Регистрация: 20.06.2016
Сообщений: 19
22.06.2016, 20:49  [ТС] 18
Название прописываю правильное, он находит его, делает активным, а потом нажимает F1 (но F1 не нажимается).
0
49 / 49 / 34
Регистрация: 16.02.2016
Сообщений: 277
22.06.2016, 22:08 19
значит код немножко нужно подправить
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.Button1Click(Sender: TObject);
var wnd:hwnd;
begin
  wnd:=FindWindow(nil,PChar(Edit1.Text));
  Label1.Caption := IntToStr(wnd);
  if wnd<>0 then
    begin
      if CmdShow=9 then
        ShowWindow(wnd,1);
      SetForegroundWindow(Wnd);
      SimulateKeyDown(VK_F1);
      sleep(100);
      simulateKeyUp(VK_F1);
    end;
end;
Добавлено через 35 минут
лучше вот так
Delphi
1
2
if (CmdShow=9) or (CmdShow=1) then
        ShowWindow(wnd,3);
0
4 / 4 / 3
Регистрация: 20.06.2016
Сообщений: 19
22.06.2016, 22:59  [ТС] 20
Ничего не работает, наверное я криворукий =(
0
22.06.2016, 22:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.06.2016, 22:59
Помогаю со студенческими работами здесь

Эмуляция нажатия клавиши в чужом окне
h:=FindWindow(nil,'Калькулятор'); if h = 0 then exit; sh:=FindWindowEx(h,0,'Button','&amp;1'); ...

Имитировать нажатие клавиш в неактивном окне
Здрасте:) У меня есть моя программа и есть программа другая. Другая программа завершает свою работу...

Нажатие клавиш в неактивном окне
Здравствуйте. Есть окно, оно не активно. Нужно программно послать нажатие какой-то клавиши,...

Нажатие клавиш в неактивном окне
Hello, ребят, суть вопроса такова. Можно ли как либо эмулировать нажатие клавишь в неактивном окне...

Имитация нажатия клавиш в неактивном браузере
Здравствуйте форумчане, очень нужна ваша помощь. Цель: программно нажать клавиши ctrl+a в...

Имитация нажатия кнопок в неактивном окне
Есть приложение, игра. Надо нажимать , допустим F1, в неактивном окне. PostMessage справляется на...


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

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