С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

SendMessage - C++

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

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

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

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

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";
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2012, 01:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос SendMessage (C++):

Трудности с SendMessage - C++
Есть такой вот код: //Autor Anonim #include &lt;conio.h&gt; #include &lt;iostream&gt; #include &lt;ostream&gt; #include &lt;Windows.h&gt; #include...

ошибка SendMessage - C++
SendMessage(HWND_BROADCAST, MsgPlayerDataReady, PutHWND, Handle); Ругается на Handle: невозможно преобразовать параметр 4 из...

SendMessage в обход Subclassing'а - C++
Столкнулся с проблемкой. Есть корявая корпоративная бд с убогим интерфейсом. Нужно фильтровать в SysTreeView32 элементы. Написал код на VBA...

SendMessage(Hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0); - C++
Добрый день) вот прочитал в инете что функция SendMessage разворачивает окно... решил попробовать.... а программа не компилируется...

програмно нажать TAB через SendMessage - C++
Как правильно передать нажатие? SendMessage(hwnd,WM_CLOSE,0,0); окно закрывает. SendMessage (hwnd, WM_KEYDOWN, VK_TAB, 0); А...

SendMessage(hListBox, LB_GETCARETINDEX, 0, 0L). Разобрать строку кода - C++
Подскажите, пожалуйста, что значит эта строка? uItem=(int)SendMessage(hListBox, LB_GETCARETINDEX, 0, 0L);

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2012, 01:15
Привет! Вот еще темы с ответами:

Sendmessage - Delphi
Здравствуйте, не могли бы вы обьяснить мне как пользоваться Sendmessage, какие модули нужно подключить как правильно прописать отправку...

SendMessage - C++ WinAPI
Помогите правильно сформировать запрос для окна. Нужно повторить такое сообщение(смотрю в Spy++): message:0x00FF wParam:00000000...

sendmessage - Delphi
есть такой пример функции sendmessage(h,wm_settext,0,lparam(lpctstr('имя'))); как есго изменить,чтобы было так: если заголовок окна...

SendMessage - Visual Basic
Подскажите справочник по полному набору принимаемых констант функцией SendMessage. К примеру 'Меняет цвет окна по hwnd ...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.