Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
wf
0 / 0 / 1
Регистрация: 09.06.2013
Сообщений: 7

Имитация нажатия клавиш в свернутом окне

10.07.2013, 18:35. Показов 3192. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер. Мне нужно сделать бота для одной игрульки. Суть там заключается в нажатии некой последовательности кнопок.

Пока имею такой код:

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
106
107
108
109
110
111
112
113
114
115
116
117
#include "windows.h"
#include <iostream>
#include <conio.h>
#include <process.h>
#include <vector>
 
bool BotEnabled = false;
void Thread(void* pParams);
int StartGameAndBot(void);
 
HWND h_GameWind;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    _beginthread( Thread, 0, NULL );
    StartGameAndBot();
 
    if (RegisterHotKey(NULL,1, MOD_ALT | MOD_NOREPEAT, 0x42))
    {
        std::cout << "Бот успешно загружен.\r\nНажмите ALT + b для активации" << std::endl;
 
        MSG msg = {0};
        while (GetMessage(&msg, NULL, 0, 0) != 0)
        {
            if (msg.message == WM_HOTKEY)
            {
                if (BotEnabled == true)
                {
                    BotEnabled = false;
                    std::cout << "Бот выключен!" << std::endl;
                }
                else if (BotEnabled == false)
                {
                    BotEnabled = true;
                    std::cout << "Бот включен!" << std::endl;
                }
            }
        }
    }
 
    return 0;
}
 
void GetProcessMainWindows(DWORD dwProcessIDs)
{
    HWND hwnd = NULL;
    HWND hwnd_main = NULL;
 
    do 
    {
        hwnd = FindWindow(NULL, "Название Игры");
        DWORD dwPID = 0;
        GetWindowThreadProcessId (hwnd, &dwPID);
 
        std::cout << "HWND окна: " << hwnd << " ID процесса: " << dwPID << " ID процесса игры: " << dwProcessIDs << std::endl;
 
        if (dwPID == dwProcessIDs)
        {
            h_GameWind = hwnd;
            hwnd = NULL;
//          hwnd_main = NULL;
            return;
        }
    }
    while (hwnd != NULL);
}
 
int StartGameAndBot(void)
{
    STARTUPINFOW si;
    ZeroMemory(&si,sizeof(STARTUPINFO));
    PROCESS_INFORMATION pi;
    GetStartupInfoW(&si);
 
    CreateProcessW(L"Client.exe", L"Client.exe 6907", NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);
    Sleep(150);
    
    GetProcessMainWindows(pi.dwProcessId);
 
    std::cout << "HWND окна: " << h_GameWind << " ID процесса: " << pi.dwProcessId << std::endl;
 
    return 0;
}
 
void Thread( void* pParams )
{
    while(true)
    {
        if (BotEnabled == true)
        {
 
            PostMessage(h_GameWind, WM_KEYDOWN, 0x41 ,1);
            Sleep(100);
            PostMessage(h_GameWind, WM_KEYUP, 0x41 ,1);
 
            Sleep(1000);
 
            PostMessage(h_GameWind, WM_KEYDOWN, 0x31 ,0);
            Sleep(100);
            PostMessage(h_GameWind, WM_KEYUP, 0x31 ,0);
 
            Sleep(100);
 
            PostMessage(h_GameWind, WM_KEYDOWN, 0x41 ,0);
            Sleep(100);
            PostMessage(h_GameWind, WM_KEYUP, 0x41 ,0);
 
            Sleep(100);
 
            PostMessage(h_GameWind, WM_KEYDOWN, 0x32 ,0);
            Sleep(100);
            PostMessage(h_GameWind, WM_KEYUP, 0x32 ,0);
        }
    }
}
Но кнопки он не нажимает. Точнее сказать нажимает.. Но не так как надо. Вот лог с Spy ++
(Такие нажатия игра не засчитывает)

Ручное нажатие:
<00057> 00AE06A4 P WM_KEYDOWN nVirtKey:'A' cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00058> 00AE06A4 P WM_CHAR chCharCode:'00F4' (244) cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00059> 00AE06A4 P WM_KEYUP nVirtKey:'A' cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:1

Нажатие "бота":
<00159> 00AE06A4 P WM_KEYDOWN nVirtKey:'A' cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00160> 00AE06A4 P WM_CHAR chCharCode:'00F4' (244) cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00161> 00AE06A4 P WM_CHAR chCharCode:'0041' (65) cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00162> 00AE06A4 P WM_KEYUP nVirtKey:'A' cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0

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

Имитация нажатия клавиш
я захотел для игры stalker сделать бота, пока хочу просто передать нажатия клавиш, я запускаю игру в неполноэкранном режиме, и запускаю...

Имитация нажатия клавиш
Как сделать так, чтобы нужный мне текст как будто сам набирался на клавиатуре, но чтобы пользователь (другой человек) сам ничего не делал?

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

2
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33379 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
10.07.2013, 18:51
прежде чем пытаться писать ботов - надо хотя бы посмотреть, что должно передаваться через LPARAM в WM_KEYDOWN... В твоем коде никакого намека на scancode, скажем, близко нет, вот и не проходит...

Привыкли заполнять только WPARAM, а LPARAM всегда оставлять нулём или (в крайнем случае) единицей, вот и огребаете теперь по полной...
1
wf
0 / 0 / 1
Регистрация: 09.06.2013
Сообщений: 7
11.07.2013, 11:23  [ТС]
Немного подумав и поискав информации у меня вышло следующее:

C++
1
2
3
4
5
6
7
8
9
10
11
            int virtual_code = MapVirtualKey(0x41, MAPVK_VK_TO_CHAR);
            int Lp = 0x41 << 16 | 1;
 
            PostMessage(h_GameWind, WM_KEYDOWN, virtual_code, Lp);
            Sleep(100);
 
 
            int lp = 1 << 31 | 1 << 30 | 0x41 << 16 | 1;
            PostMessage(h_GameWind, WM_KEYUP, virtual_code, lp);
 
            Sleep(10000);
Казалось бы решение почти найдено, но нет, проблема все еще есть.

Теперь Spy++ Показывает следующее:

Ввод с клавиатуры (руками и др. частями тела):
<00098> 001704C4 P WM_KEYDOWN nVirtKey:'A' cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00099> 001704C4 P WM_CHAR chCharCode:'00F4' (244) cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00100> 001704C4 P WM_KEYUP nVirtKey:'A' cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:1

Ввод через бота:
<00001> 001704C4 P WM_KEYDOWN nVirtKey:'A' cRepeat:1 ScanCode:41 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00002> 001704C4 P WM_CHAR chCharCode:'00F4' (244) cRepeat:1 ScanCode:41 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00003> 001704C4 P WM_KEYUP nVirtKey:'A' cRepeat:1 ScanCode:41 fExtended:0 fAltDown:0 fRepeat:1 fUp:1

Добавлено через 9 минут
Сама игра реагирует на нажатия и на русской раскладке и на любой другой. По сути нужно нажать A (Ф)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.07.2013, 11:23
Помогаю со студенческими работами здесь

Имитация нажатия клавиш в русской раскладке
Здравствуйте! Требуется имитировать нажатие клавиши ю( в русской раскладке). keybd_event('ю',0,0,0); //в русской раскладке не...

Перехватывать все нажатия клавиш в окне конкретного процесса
Добрый день. Необходимо перехватывать все нажатия клавиш в окне конкретного процесса. Вот код DLL, которая инджектится в процесс: ...

Как сделать распознавания текста в окне программы и делать эмуляцию нажатия клавиш
помогите!

Имитация нажатия кнопок клавиатуры нажатиями кнопок в окне
Скажите,как заменить нажатие кнопок клавиатуры на нажатие кнопок в окне?

Имитация нажатия клавиш в стороннем окне
Я знаю текст заголовка окна. Как мне передать в него нажатия клавиш и в том числе специальных - таких как esc, enter? Можно пойти иным...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru