Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 08.11.2015
Сообщений: 65

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

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

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

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


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

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


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

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

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


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

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

В любом случае - будет опыт. Огромное спасибо всем кто откликнется!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.03.2016, 18:32
Ответы с готовыми решениями:

Эмуляция нажатия клавиши клавиатуры в чужом приложении
Добрый день. Вот, для примера, нажать F1 в "Калькуляторе", пишу: HWND Wnd=FindWindow(NULL,L"Калькулятор Плюс"); ...

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

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

3
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
08.03.2016, 18:35
Кажется такое умеет программа AutoIt.
1
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
08.03.2016, 20:14
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
09.03.2016, 01:01

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.03.2016, 01:01
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru