Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/47: Рейтинг темы: голосов - 47, средняя оценка - 4.96
0 / 0 / 0
Регистрация: 26.11.2023
Сообщений: 6

Реализация GUI

14.01.2024, 05:56. Показов 8768. Ответов 2

Студворк — интернет-сервис помощи студентам
Доброго времени суток, написал небольшого бота на с++, который работает как консольное приложение, но в один момент ударила моча в голову и мне приспичило сделать вместо консоли - графический интерфейс в котором можно было-бы:

1) Менять задержку срабатывания (delayMs)
2) Менять горячие клавиши активации и паузы
3) Выводить кол-во срабатываний функции void clickMouse()

(Активация бота всё так-же по горячим клавишам, просто что-бы был сраный интерфейс а не консоль)

Я начал читать как это всё реализовать и ничего не понял, пишу сюда уже от безысходности
Авось кто-то да поможет сделать

код:

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
118
119
120
121
122
123
124
125
126
127
128
129
#include <windows.h>
#include <iostream>
 
#define VK_X 0x58
#define VK_Q 0x51
 
// Имя окна, которое мы ищем
const wchar_t* targetWindowName = L"Window_title";
 
// Горячие клавиши
const int hotkeyId = 1;
const UINT hotkeyVk = VK_X;
const UINT hotkeyModifiers = MOD_ALT;
 
const int exitHotkeyId = 2;
const UINT exitHotkeyVk = VK_Q;
const UINT exitHotkeyModifiers = MOD_ALT;
 
// Задержка между нажатиями клавиш
const DWORD delayMs = 500;
 
// Координаты пикселя для проверки
const int pixelX = 413;
const int pixelY = 251;
 
// Целевые координаты курсора
const int targetCursorX = 1072;
const int targetCursorY = 637;
 
// Функция для получения цвета пикселя
COLORREF getPixelColor(int x, int y) {
    HDC hdc = GetDC(NULL);
    COLORREF color = GetPixel(hdc, x, y);
    ReleaseDC(NULL, hdc);
    return color;
}
 
// Функция для эмуляции нажатия клавиши
void pressKey(HWND hwnd) {
    // Переключаемся на окно
    SetForegroundWindow(hwnd);
 
    // Эмулируем нажатие клавиши
    INPUT input = { 0 };
    input.type = INPUT_KEYBOARD;
    input.ki.wVk = 'X';
    SendInput(1, &input, sizeof(INPUT));
 
    // Эмулируем отпускание клавиши
    ZeroMemory(&input, sizeof(INPUT));
    input.type = INPUT_KEYBOARD;
    input.ki.wVk = 'X';
    input.ki.dwFlags = KEYEVENTF_KEYUP;
    SendInput(1, &input, sizeof(INPUT));
}
 
// Функция для эмуляции нажатия левой кнопки мыши
void clickMouse() {
    // Эмулируем нажатие левой кнопки мыши
    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
    Sleep(100); // небольшая задержка для эмуляции реального нажатия
    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
}
 
int main() {
    // Регистрируем горячие клавиши
    if (!RegisterHotKey(NULL, hotkeyId, hotkeyModifiers, hotkeyVk)) {
        std::cerr << "Failed to register hotkey" << std::endl;
        return 1;
    }
 
    if (!RegisterHotKey(NULL, exitHotkeyId, exitHotkeyModifiers, exitHotkeyVk)) {
        std::cerr << "Failed to register exit hotkey" << std::endl;
        return 1;
    }
 
    // Цикл обработки сообщений
    MSG msg = { 0 };
    bool running = true;
    while (running && GetMessage(&msg, NULL, 0, 0) != 0) {
        if (msg.message == WM_HOTKEY) {
            if (msg.wParam == hotkeyId) {
                // Нашли горячую клавишу, ищем окно
                HWND hwnd = FindWindow(NULL, targetWindowName);
                if (hwnd != NULL) {
                    // Нашли окно
                    while (running) {
                        // Эмулируем нажатие клавиши
                        pressKey(hwnd);
                        Sleep(delayMs);
 
                        // Получаем цвет пикселя
                        COLORREF color = getPixelColor(pixelX, pixelY);
                        int red = GetRValue(color);
                        int green = GetGValue(color);
                        int blue = GetBValue(color);
 
                        // Проверяем, изменился ли цвет пикселя
                        if ((red >= 20 && red <= 76) && (green >= 97 && green <= 155) && (blue >= 13 && blue <= 72)) {
                            // Перемещаем курсор
                            SetCursorPos(targetCursorX, targetCursorY);
 
                            // Нажимаем левую кнопку мыши
                            clickMouse();
 
                            // Ставим бота на паузу
                            break;
                        }
 
                        // Проверяем, не было ли нажато экстренное выключение
                        MSG exitMsg;
                        if (PeekMessage(&exitMsg, NULL, 0, 0, PM_REMOVE) && exitMsg.message == WM_HOTKEY && exitMsg.wParam == exitHotkeyId) {
                            break;
                        }
                    }
                }
            }
            else if (msg.wParam == exitHotkeyId) {
                break;
            }
        }
    }
 
    // Отменяем регистрацию горячих клавиш
    UnregisterHotKey(NULL, hotkeyId);
    UnregisterHotKey(NULL, exitHotkeyId);
 
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.01.2024, 05:56
Ответы с готовыми решениями:

Реализация многопоточности в GUI приложении
Здравствуйте! Заранее извиняюсь за, возможно, глупые вопросы по поводу этой темы, но они все-таки возникли ^_^ Стоит задача...

Как запустить qt gui программу, как демон, без gui, скрыв gui?
Как запустить qt gui программу, как демон, без gui, скрыв gui? В gui браузер выполняет определенные действия, и нужно запустить этот...

Как запустить GUI приложение (например, notepad.exe) без отображения GUI?
Добрый день. Интересует есть ли такая возможность, как запустить GUI приложение (например, notepad.exe) без отображения GUI?

2
Злостный нарушитель
 Аватар для Verevkin
10637 / 5788 / 1277
Регистрация: 12.03.2015
Сообщений: 26,723
14.01.2024, 06:28
Цитата Сообщение от Kr0ne Посмотреть сообщение
написал небольшого бота на с++, который работает как консольное приложение
А чего он делает-то? И почему ты его обозвал ботом?
0
14.01.2024, 14:11

Не по теме:

GUI библы для слабых?

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.01.2024, 14:11
Помогаю со студенческими работами здесь

Как лучше и быстрее из SQL в QVector и в GUI или сразу из SQL в GUI
Доброе время суток! Ну собственно вопрос в теме, как лучше сделать. Сначала прочитать SQLite в вектор и работать с ним и оставить файл...

Реализация Foreign Key в GUI
Раньше в MS ACCESS была такая фича - когда в Форме делаешь список, его можно сделать двухстолбцовым, 1 столбец скрыть, к списку подсосать...

Многопоточность в GUI приложении, реализация
Добрый день! Пожалуйста, помогите разобраться с мультипоточностью. Необходимо создать приложение в коем будут наличествовать 4 прогресс...

Дискретное преобразование Фурье. Реализация GUI
Здравствуйте! Помогите, пожалуйста. Подскажите с чего начать. В общем, нужно создать GUI приложение, позволяющее визуализировать...

Лучшая реализация GUI на core profile
Приветствую. Проектирую retained-mode GUI и хотел бы спросить вас о том как лучше реализовать некоторые вещи. В данный момент я делаю...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru