Играя в Royal Quest и бесконечная нажимая на пробел для сборки сокровищ, которые падали мне с монстров, решил сделать программу, которая делала бы это за меня. Так как начал изучать c++ — решил писать на нем.
Создадим новый проект с названием AutoSpace. Я выбрал консольные приложение, т.к. можно смотреть как работает программа и я так привык.

Так как игра принимает нажатие клавиши с помощью DirectInput, чтобы имитировать нажатие клавиши в игре нам нужна будет библиотека windows.h. Вот все библиотеки, которые нам нужны.

Создадим DWORD (32-битное целое) функцию с названием AutoGet и двумя входящими переменными: key (Название клавиши) и key_pos (Состояние клавиши). Переменная key — это слово, а точнее текст — используем тип данных WORD. А key_pos имеет только два значения: нажатие клавиши (FALSE) и ее отпускание (TRUE) — присвоим ей класс BOOL.

Чтобы имитировать нажатие клавиши, будем использовать класс INPUT. Он имеет следующую структуру:

Нам нужна только переменная ki. Присвоим ей значение INPUT_KEYBOARD.
Идем дальше. Перед переменной ki видим ее класс : KEYBDINPUT. Вот его структура:

Присвоим значения переменным wScan и dwFlags. Данная функция будет отдавать другой нашу структуру: SendInput(Число структур(у нас одна), массив структур типа INPUT(у нас AUTO), размер массива). И в итоге получим такую функцию:

Половина дела сделана! Осталось написать функцию, которая бы преобразовывала отправленные данные и отправляла их в функцию AutoGet.
Назовем эту функцию AutoSend и заставим ее принимать две переменные: WORD key и BOOL key_pos. В функции объявим UINT(unsigned int) key_uint и присвоим ей значение key, но перед этим ее нужно пропустить через функцию MapVirtualKey(), чтобы преобразовать данные.
В итоге:

Теперь поместим нажатие и отпускание клавиши в бесконечный цикл и выставим задержку.

Готово!
Спасибо за внимание!
Вот код:
Создадим новый проект с названием AutoSpace. Я выбрал консольные приложение, т.к. можно смотреть как работает программа и я так привык.

Так как игра принимает нажатие клавиши с помощью DirectInput, чтобы имитировать нажатие клавиши в игре нам нужна будет библиотека windows.h. Вот все библиотеки, которые нам нужны.

Создадим DWORD (32-битное целое) функцию с названием AutoGet и двумя входящими переменными: key (Название клавиши) и key_pos (Состояние клавиши). Переменная key — это слово, а точнее текст — используем тип данных WORD. А key_pos имеет только два значения: нажатие клавиши (FALSE) и ее отпускание (TRUE) — присвоим ей класс BOOL.

Чтобы имитировать нажатие клавиши, будем использовать класс INPUT. Он имеет следующую структуру:

Нам нужна только переменная ki. Присвоим ей значение INPUT_KEYBOARD.
Идем дальше. Перед переменной ki видим ее класс : KEYBDINPUT. Вот его структура:

Присвоим значения переменным wScan и dwFlags. Данная функция будет отдавать другой нашу структуру: SendInput(Число структур(у нас одна), массив структур типа INPUT(у нас AUTO), размер массива). И в итоге получим такую функцию:

Половина дела сделана! Осталось написать функцию, которая бы преобразовывала отправленные данные и отправляла их в функцию AutoGet.
Назовем эту функцию AutoSend и заставим ее принимать две переменные: WORD key и BOOL key_pos. В функции объявим UINT(unsigned int) key_uint и присвоим ей значение key, но перед этим ее нужно пропустить через функцию MapVirtualKey(), чтобы преобразовать данные.
В итоге:

Теперь поместим нажатие и отпускание клавиши в бесконечный цикл и выставим задержку.

Готово!
Спасибо за внимание!
Вот код:
#include "stdafx.h"
#include "windows.h"
DWORD AutoGet(WORD key, BOOL key_pos)
{
INPUT Auto;
Auto.type = INPUT_KEYBOARD;
Auto.ki.wScan = key;
Auto.ki.dwFlags = KEYEVENTF_SCANCODE | (key_pos ? KEYEVENTF_KEYUP : 0);
return SendInput(1, &Auto, sizeof(Auto));
}
DWORD AutoSend(WORD key, BOOL key_pos)
{
UINT key_uint = MapVirtualKey(key, MAPVK_VK_TO_VSC);
return AutoGet(key_uint, key_pos);
}
int main()
{
for (;;)
{
AutoSend(VK_SPACE, FALSE);
AutoSend(VK_SPACE, TRUE);
Sleep(50);
}
return 0;
}
Комментарии (8)
vidyacat
07.09.2017 18:24+1Играя в Royal Quest и бесконечная нажимая на пробел для сборки сокровищ, которые падали мне с монстров, решил сделать программу, которая делала бы это за меня. Так как начал изучать c++ — решил писать на нем.
типичный программист с++
с уважением, программист с++
NeonMercury
08.09.2017 10:33В этом примере вы скорее всего подучили не C++, а WinAPI. Расширяйте кругозор, плюсы прекрасный язык, но есть инструменты и более подходящие. Четыре строки на AutoIt:
While True Send("{SPACE}") Sleep(50) Wend
Потом, не стоит вставлять код изображениями. Ваше последнее изображение весит 51 923 байт. В тексте из него 539 символов. Даже если взять UTF-32 (4 байта на символ), то получим 2156 байт, что составляет всего 4,15% от изображения. А на самом деле не UTF-32, а UTF-8, который в этом случае компактнее. Не говоря уже о том, что обычно из изображения скопировать никак (но у вас есть в конце текст всей программы, дублирующий изображения).
Простите, но это слегка не уровень хабра, как мне кажется. На плюсах тут, как правило, более серьёзные вещи пишутся.
Ritorno
08.09.2017 12:05+1Хорошо, автор написал программу для себя, но совершенно непонятно, чем это может быть кому-то интересно?
sidorovmax
08.09.2017 12:05Этот инструмент должен забивать пробелами игровой чат и поля ввода текста.
Kolyuchkin
Вопрос: «Почему Вы структуры классами обзываете?»
den_golub
Наверно потому, что — <...> приводится информация о классах и структурах C++. В C++ эти конструкции идентичны, за исключением того факта, что структуры по умолчанию открыты для доступа, а классы — закрыты.<....>