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

Перехват и имитация нажатия клавиши клавиатуры в чужом приложении

08.03.2016, 18:32. Показов 3443. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть тема...
Нужно, чтобы при нажатии на кнопку, например f1 . У меня последовательно с разными задержками нажимались кнопки:

ESC
задержка 2 секунды
PageDown
задержка 5 секунд
Home


Причем... Это должно делаться в другой, активной программе.

ассоциация затеи - клавиатурный кликер для игры. Как обратиться в окно игры - я тоже не знаю.


Как это выглядит.

1) Я запускаю игру (любую).
2) сворачиваю
3) Запускаю свою прогу. В проге динамически выбираю клавишу с клавиатуры. Эта клавиша будет запускать (таймер?) функцию в которой последовательно будут нажиматься соответствующие кнопки.
4) ниже выбираю 3 другие клавиши (динамически). В виде выпадающих списков с названиями клавиш.
5) задаю для каждой кнопки задержку.
6) нажимаю старт.
7) разворачиваю игру.
8) при нажатии в игре на клавишу f1 . У меня срабатывает моя прога и в игре имитирует нажатие выбранных клавиш с нужными задержками. Срабатывание и повтор при каждом нажатии, пока запущена программа.

Ну... и таких кнопок будет 8. Которые будут, как бы, запускать макросы...


Наверняка как-то через хендлы...

Но! Меня попросили сделать. А это совсем не мой уровень... Пока я только функции простенькие писал для обработки текста в моей программе. Такого нет... Хендлах имею только представление, но не знания... Буду рад практическим советам с элементами кодов. Буду собирать из советов, если позволит уровень=)

В любом случае - будет опыт. Огромное спасибо всем кто откликнется!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.03.2016, 18:32
Ответы с готовыми решениями:

Эмуляция нажатия клавиши клавиатуры в чужом приложении
Добрый день. Вот, для примера, нажать F1 в "Калькуляторе", пишу: HWND...

Эмуляция нажатия клавиши в чужом приложении
Знаю что это можно сделать используя SendKeys.SendWait или PostMessage сделал и так и так...

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

Перехват нажатия клавиши F11 в другом приложении
Здравствуйте форумчанины! Мне нужно в моем приложении перехватывать нажатие клавиши F11. У меня...

3
Хитрая блондиночка $)
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
08.03.2016, 18:35 2
Кажется такое умеет программа AutoIt.
1
случайный прохожий
2920 / 1937 / 606
Регистрация: 20.07.2013
Сообщений: 5,133
08.03.2016, 20:14 3
cpp:
C++
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "cspin"
#pragma link "cspin"
#pragma resource "*.dfm"
TForm1 *Form1;
unsigned int F5;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  Button1->Click();
  F5 = GlobalAddAtom("F5CheckAllocationsHotKey");
  RegisterHotKey(NULL, F5, 0, VK_F5);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int act;
if (GetWindowThreadProcessId(GetForegroundWindow(), NULL) == GetWindowThreadProcessId(FindWindow(NULL, "Warcraft III"), NULL))
  act = 1;
else
  act = 0;
if (act == 1)
  {
    keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY, 0);
    //нажали и удерживаем Ctrl
    keybd_event(67, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    keybd_event(67, 0, KEYEVENTF_EXTENDEDKEY, 0);
    //нажимаем клавишу C
    //отпускаем клавиши
    keybd_event(67, 0,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0);
    keybd_event(VK_CONTROL, 0,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0);
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  Button1->Click();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CSpinEdit1Change(TObject *Sender)
{
  Timer1->Interval = CSpinEdit1->Value;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  if (Button2->Caption == "Отключить")
  {
    Button2->Caption = "Включить";
    Timer1->Enabled = 0;
    Label4->Caption = "Эмуляция отключена";
    Label4->Font->Color = clRed;
  }
  else
  {
    Button2->Caption = "Отключить";
    Timer1->Enabled = 1;
    Label4->Caption = "Эмуляция включена";
    Label4->Font->Color = clGreen;  
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
if(GetWindowThreadProcessId(FindWindow(NULL, "Warcraft III"), NULL) > 0)
  Label1->Caption = "Статус игры: Warcraft III запущен.";
else
  Label1->Caption = "Статус игры: Warcraft III не запущен.";
if (GetWindowThreadProcessId(GetForegroundWindow(), NULL) == GetWindowThreadProcessId(FindWindow(NULL, "Warcraft III"), NULL))
  Label2->Caption = "Статус окна: игра активна.";
else
  Label2->Caption = "Статус окна: игра не активна.";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
  Button3->Click(); 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  UnregisterHotKey(NULL, F5);
  GlobalDeleteAtom(F5);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg, bool &Handled)
{
if (Msg.message == WM_HOTKEY)
  if (Msg.wParam == F5)
    Button2->Click();
}
//---------------------------------------------------------------------------
h:
C++
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
//---------------------------------------------------------------------------
 
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <ExtCtrls.hpp>
#include "cspin.h"
#include <AppEvnts.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TLabel *Label1;
    TLabel *Label2;
    TButton *Button1;
    TTimer *Timer1;
    TCSpinEdit *CSpinEdit1;
    TLabel *Label3;
    TButton *Button2;
    TLabel *Label4;
    TButton *Button3;
    TTimer *Timer2;
    TApplicationEvents *ApplicationEvents1;
    TLabel *Label5;
    void __fastcall FormCreate(TObject *Sender);
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall Timer1Timer(TObject *Sender);
    void __fastcall CSpinEdit1Change(TObject *Sender);
    void __fastcall Button2Click(TObject *Sender);
    void __fastcall Button3Click(TObject *Sender);
    void __fastcall Timer2Timer(TObject *Sender);
    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
    void __fastcall ApplicationEvents1Message(tagMSG &Msg, bool &Handled);
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Миниатюры
Перехват и имитация нажатия клавиши клавиатуры в чужом приложении  
0
BRcr
09.03.2016, 01:01     Перехват и имитация нажатия клавиши клавиатуры в чужом приложении
  #4

Не по теме:

Надо сказать, AutoIt умеет много больше, чем кликать. И кликеры, разумеется, в ней писать одно удовольствие)

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.03.2016, 01:01

Имитация нажатия клавиши клавиатуры
Добрый день! Прошу помощи. Подскажите, пожалуйста, как слелать виртуальную клавиатуру. Вопрос...

Имитация нажатия кнопки клавиатуры в другом приложении
Здравствуйте. В инете нашел только как кнопку нажимать,а мне нужно:например в игре управление...

Перехват нажатия клавиатуры в конкретном приложении
Возможно это уже где то звучало, но тк с апи не имел ничего общего обращаюсь к вам. Надо создать...

Имитация клика мышкой или нажатия клавиши клавиатуры
Нужно программно нажать ЛКМ или кнопку клавиатуры. SendKeys и mouse_event НЕ подходит!! Окно с...


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

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

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