Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Nalik
39 / 25 / 9
Регистрация: 30.11.2012
Сообщений: 627
#1

SendMessage - C++

30.11.2012, 01:15. Просмотров 1286. Ответов 0
Метки нет (Все метки)

Всем привет!
Пишу программу которая сама нажимает мышкой в игре по заданным координатам.
Для этого игра уже должна быть запущена. Если игра не запущенна то на экран выдается соответствующее сообщение.
Если вдруг игра была закрыта по каким бы то ни было причинам (вылетела или ещё что-то), то она сама перезаходит и продолжает работу снова. Так должно быть чисто теоретически, однако когда игра перезапускается, программа не жмёт по заданным координатам до тех пор пока я не нажму мышкой в какую либо точку вне окна игры, только после этого она начнёт работать. Так же обратил внимание что когда я навожу мышку внутрь игрового окна на какое либо пустое место программа перестаёт работать (ну это как раз объяснимо, там сначала должна ставится мышка поверх кнопки на которую нужно нажать тем самым делая её "активной", но всё равно хотелось бы это исправить).
Предполагаю что в этом вся и проблема состоит, что когда игра перезапускается, то игровое окно становится то ли активным, то ли мышка внутрь окна помещается и потому бот перестаёт работать.
В общем если кто-то заметит какие нибудь косяки в коде, подскажите пожалуйста что делать.

Для примера взял игру Dishonored и быстренько настрочил на неё аналогичный код, чтобы показать основную проблему. http://*************/s/2yr1i

ЗЫ: Если создал не в том разделе тему, то прощу прощения, не ругайтесь, а лучше перенесите просто в нужный.

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
#include <iostream>
#include <ostream>
#include <clocale>
#include <conio.h>
#include <Windows.h> //для определения окна
#include <WinUser.h> //для определения окна
#include <ShellAPI.h> //для запуска процессов
 
 
using namespace std;
 
//Объявляем функции
void send5 (HWND Handle_Kalc, int x, int y);
void sendplus (HWND Handle_Kalc, int x, int y);
 
void main()
{
    HWND Handle_Kalc; 
 
    setlocale(LC_CTYPE, "Russian"); //Руссификатор
 
    Handle_Kalc = FindWindow(NULL, L"**Dishonored"); // получаю хендл окна по его заголовку
        if(Handle_Kalc) //Проверка Хендла окна
    {   
        cout << "\nИгра запущена: начинаем работу\n"; //Выводим текст на экран
        while(1) 
        {
            while(1) //Бесконечный цикл
            {
                Handle_Kalc = FindWindow(NULL, L"**Dishonored"); // получаю хендл окна каждый новый цикл
 
                send5(Handle_Kalc, 352, 450); //Вызов функции 
                sendplus(Handle_Kalc, 716, 507); //Вызов функции
            
                    if (Handle_Kalc) 
                {
                    cout << "\n>>Работа продолжается..\n";
                }
                else 
                 {
                     cout << "\n>>Игра была закрыта, запускаю её снова...\n";
                 
                     ShellExecute( Handle_Kalc,L"open", L"Dishonored.exe",0, L"E:\\Games\\Dishonored\\Binaries\\Win32\\",SW_SHOWNORMAL ); //запустить игру
                 
                     cout << ">>Запускаю игру...\n"; //Выдать текст на экран
                     Sleep(15000);
        
                } 
            }
        }
    }
    else //Если хендл окна ложен выдать текст   
    {
        cout << "\nИгра не запущена\n"; //Выводим текст на экран
    }
    getch();
}
 
 
void send5 (HWND Handle_Kalc, int x, int y)
{
        SendMessage(Handle_Kalc, WM_MOUSEMOVE, MK_LBUTTON, MAKELONG(x,y)); //навести курсор в координаты
        SendMessage(Handle_Kalc, WM_LBUTTONDOWN,MK_LBUTTON,MAKELONG(x,y)); //нажать в координатах
        SendMessage(Handle_Kalc,WM_LBUTTONUP,0,MAKELONG(x,y)); //отпустить в координатах
 
        Sleep(1300);
        SendMessage(Handle_Kalc, WM_LBUTTONDOWN,MK_LBUTTON,MAKELONG(x,y)); //нажать в координатах
        SendMessage(Handle_Kalc,WM_LBUTTONUP,0,MAKELONG(x,y)); //отпустить в координатах
        cout << ">>Задание\n";
}
 
void sendplus (HWND Handle_Kalc, int x, int y)
{
        SendMessage(Handle_Kalc, WM_MOUSEMOVE, MK_LBUTTON, MAKELONG(x,y)); //навести курсор в координаты
        SendMessage(Handle_Kalc, WM_LBUTTONDOWN,MK_LBUTTON,MAKELONG(x,y)); //нажать в координатах
        SendMessage(Handle_Kalc,WM_LBUTTONUP,0,MAKELONG(x,y)); //отпустить в координатах
 
        Sleep(1300);
        SendMessage(Handle_Kalc, WM_LBUTTONDOWN,MK_LBUTTON,MAKELONG(x,y)); //нажать в координатах
        SendMessage(Handle_Kalc,WM_LBUTTONUP,0,MAKELONG(x,y)); //отпустить в координатах
        cout << ">>Назад\n";
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2012, 01:15     SendMessage
Посмотрите здесь:

C++ SendMessage(Hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
Delphi sendmessage
C++ програмно нажать TAB через SendMessage
SendMessage в обход Subclassing'а C++
Delphi SendMessage();
C++ Builder SendMessage()
Трудности с SendMessage C++
SendMessage C++ WinAPI
Delphi WinAPI SendMessage
Visual Basic SendMessage
C++ ошибка SendMessage
C++ SendMessage(hListBox, LB_GETCARETINDEX, 0, 0L). Разобрать строку кода

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 15:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru