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

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

image

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

image

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

image

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

image

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

image

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

image

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

В итоге:

image

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

image

Готово!
Спасибо за внимание!

Вот код:

#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)



  1. vidyacat
    07.09.2017 18:24
    +1

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

    типичный программист с++

    с уважением, программист с++


  1. 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, который в этом случае компактнее. Не говоря уже о том, что обычно из изображения скопировать никак (но у вас есть в конце текст всей программы, дублирующий изображения).

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


  1. Ritorno
    08.09.2017 12:05
    +1

    Хорошо, автор написал программу для себя, но совершенно непонятно, чем это может быть кому-то интересно?


  1. sidorovmax
    08.09.2017 12:05

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


  1. reishi
    08.09.2017 12:05

    Для такой задачм проще было использовать autohotkey или подобное


  1. vlad2711
    08.09.2017 14:47

    Не о чем. Может и круто, но это не интересно. Явно не тема для статьи