#ifndef UNICODE #define UNICODE #endif #ifndef _UN...
Criado em: 12 de maio de 2026
Respondido usando GPT-5.5 Thinking por Chat01
Criado em: 12 de maio de 2026
Respondido usando GPT-5.5 Thinking por Chat01
#ifndef UNICODE
#define UNICODE
#endif
#ifndef _UNICODE
#define _UNICODE
#endif
#include <windows.h>
#include <commctrl.h> // для работы с элементами управления типа ListView
#include <thread>
#include <atomic>
#include <vector>
#include <string>
#include <cstdlib>
#include <cwchar>
#include <chrono>
#include <sstream>
// Прототип для функции создания виртуальной мыши:
void createVirtualMouse();
// ---------------------------
// Глобальные переменные
// ---------------------------
std::atomic<bool> clicking(false);
int cps = 500; // Количество кликов в секунду (также число ошибок для кнопки)
std::vector<HWND> windowList; // Список всех обнаруженных окон
std::vector<HWND> selectedWindows; // Список выбранных окон (отмеченных в ListView)
bool useVirtualMouse = false; // Включён ли режим виртуальной мыши
HWND hVirtualMouse = nullptr; // Хэндл окна виртуальной мыши
POINT virtualMousePos = { 0, 0 }; // Позиция виртуальной мыши
// ---------------------------
// Элементы пользовательского интерфейса (UI)
// ---------------------------
HWND hBtnRefresh = nullptr; // Кнопка "Обновить список окон"
HWND hBtnApplyWindows = nullptr; // Кнопка "Применить окна"
HWND hStaticApplied = nullptr; // Строка с количеством выбранных окон
HWND hListView = nullptr; // ListView для отображения списка окон
HWND hEditCPS = nullptr; // Поле для ввода CPS
HWND hBtnApplyCPS = nullptr; // Кнопка "Применить CPS"
HWND hStaticCPS = nullptr; // Строка для отображения текущего CPS
HWND hChkVirtual = nullptr; // Чекбокс "Виртуальная мышь"
HWND hBtnErrors = nullptr; // Кнопка "Не нажимать"
HWND g_mainHwnd = nullptr; // Главное окно приложения
// ---------------------------
// Идентификаторы элементов управления
// ---------------------------
enum {
ID_BTN_REFRESH = 101,
ID_LISTVIEW = 102,
ID_EDIT_CPS = 103,
ID_BTN_APPLY_CPS = 104,
ID_STATIC_CPS = 105,
ID_CHK_VIRTUAL = 106,
ID_BTN_APPLY_WINDOWS = 107,
ID_HOTKEY_F6 = 108,
ID_STATIC_APPLIED = 109,
ID_BTN_ERRORS = 110 // Новый ID для кнопки "Не нажимать"
};
// ---------------------------
// Прототипы дополнительных функций
// ---------------------------
void simulateClickForRoblox();
void simulateVirtualClick();
void RefreshWindowList(HWND hListView);
void UpdateSelectedWindows(HWND hListView);
void clickLoop(HWND mainHwnd);
// ---------------------------
// Функция перечисления окон (EnumWindows)
// ---------------------------
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
wchar_t title[256] = { 0 };
GetWindowTextW(hwnd, title, sizeof(title) / sizeof(wchar_t));
if (IsWindowVisible(hwnd) && wcslen(title) > 0)
windowList.push_back(hwnd);
return TRUE;
}
void RefreshWindowList(HWND hListView)
{
windowList.clear();
EnumWindows(EnumWindowsProc, 0);
ListView_DeleteAllItems(hListView);
textstatic bool colAdded = false; if (!colAdded) { LVCOLUMN col = {0}; col.mask = LVCF_TEXT | LVCF_WIDTH; col.pszText = const_cast<LPWSTR>(L"Список окон"); col.cx = 240; ListView_InsertColumn(hListView, 0, &col); colAdded = true; } LVITEM item = {0}; item.mask = LVIF_TEXT; int index = 0; for (HWND wnd : windowList) { int len = GetWindowTextLengthW(wnd); if (len > 0) { std::wstring title(len + 1, L'\0'); GetWindowTextW(wnd, &title[0], len + 1); title.resize(wcslen(title.c_str())); item.iItem = index; item.pszText = const_cast<LPWSTR>(title.c_str()); ListView_InsertItem(hListView, &item); index++; } } selectedWindows.clear(); SetWindowTextW(hStaticApplied, L"Применённые окна: 0");
}
void UpdateSelectedWindows(HWND hListView)
{
selectedWindows.clear();
int count = ListView_GetItemCount(hListView);
for (int i = 0; i < count; i++)
{
UINT state = ListView_GetItemState(hListView, i, LVIS_STATEIMAGEMASK);
if (state == INDEXTOSTATEIMAGEMASK(2))
selectedWindows.push_back(windowList[i]);
}
std::wstringstream ws;
ws << L"Применённые окна: " << selectedWindows.size();
SetWindowTextW(hStaticApplied, ws.str().c_str());
}
// ---------------------------
// Симуляция клика по реальному курсору (SendInput)
// ---------------------------
void simulateClickForRoblox()
{
INPUT inputs[2] = {0};
inputs[0].type = INPUT_MOUSE;
inputs[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
inputs[1].type = INPUT_MOUSE;
inputs[1].mi.dwFlags = MOUSEEVENTF_LEFTUP;
SendInput(2, inputs, sizeof(INPUT));
}
// ---------------------------
// Симуляция клика по виртуальной мыши (с преобразованием координат)
// ---------------------------
void simulateVirtualClick()
{
int screenWidth = GetSystemMetrics(SM_CXSCREEN);
int screenHeight = GetSystemMetrics(SM_CYSCREEN);
double xAbs = (double)virtualMousePos.x * 65535.0 / (screenWidth - 1);
double yAbs = (double)virtualMousePos.y * 65535.0 / (screenHeight - 1);
textINPUT inputs[3] = {0}; inputs[0].type = INPUT_MOUSE; inputs[0].mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE; inputs[0].mi.dx = (LONG)xAbs; inputs[0].mi.dy = (LONG)yAbs; inputs[1].type = INPUT_MOUSE; inputs[1].mi.dwFlags = MOUSEEVENTF_LEFTDOWN; inputs[2].type = INPUT_MOUSE; inputs[2].mi.dwFlags = MOUSEEVENTF_LEFTUP; SendInput(3, inputs, sizeof(INPUT));
}
// ------------------------------------------------------------------------------
// Функция clickLoop
//
// Определяет "эффективную" точку для клика:
// если выбраны окна – если курсор находится внутри выбранного окна – используется
// реальная позиция, иначе (при включённом режиме виртуальной мыши) используется virtualMousePos.
// Если окон не выбрано – кликаем глобально (в зависимости от режима).
// ------------------------------------------------------------------------------
void clickLoop(HWND mainHwnd)
{
using clock = std::chrono::steady_clock;
using micro = std::chrono::microseconds;
textmicro period(1000000 / cps); auto nextTime = clock::now(); while (clicking) { nextTime += period; POINT realPos; GetCursorPos(&realPos); // Вычисляем эффективную позицию для клика POINT effectivePos = realPos; if (!selectedWindows.empty()) { bool isInWindow = false; for (HWND wnd : selectedWindows) { RECT rect; if (GetWindowRect(wnd, &rect) && PtInRect(&rect, realPos)) { isInWindow = true; break; } } if (!isInWindow && useVirtualMouse) effectivePos = virtualMousePos; } else { if (useVirtualMouse) effectivePos = virtualMousePos; } // Если окна выбраны – отправляем клик в каждое окно if (!selectedWindows.empty()) { for (HWND wnd : selectedWindows) { if (IsWindow(wnd)) { POINT pt = effectivePos; ScreenToClient(wnd, &pt); PostMessage(wnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(pt.x, pt.y)); PostMessage(wnd, WM_LBUTTONUP, 0, MAKELPARAM(pt.x, pt.y)); } } } else // Глобальный клик { if (useVirtualMouse) simulateVirtualClick(); else simulateClickForRoblox(); } while (clock::now() < nextTime) { auto remaining = nextTime - clock::now(); if (remaining > micro(300)) { DWORD sleepTime = (DWORD)std::chrono::duration_cast<std::chrono::milliseconds>(remaining - micro(300)).count(); Sleep(sleepTime); } } }
}
// ---------------------------
// Процедура виртуальной мыши – отрисовывает красный круг диаметром 20px
// ---------------------------
LRESULT CALLBACK VirtualMouseProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
HBRUSH hBrush = CreateSolidBrush(RGB(255, 0, 0));
Ellipse(hdc, 0, 0, 20, 20);
DeleteObject(hBrush);
EndPaint(hwnd, &ps);
}
return 0;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
}
// ---------------------------
// Функция создания виртуальной мыши (окно с красным кругом)
// ---------------------------
void createVirtualMouse()
{
if (hVirtualMouse != nullptr)
return;
textWNDCLASS wc = {0}; wc.lpfnWndProc = VirtualMouseProc; wc.hInstance = GetModuleHandle(NULL); wc.lpszClassName = L"VirtualMouseClass"; RegisterClass(&wc); hVirtualMouse = CreateWindowEx( WS_EX_TOPMOST | WS_EX_TOOLWINDOW | WS_EX_NOACTIVATE, L"VirtualMouseClass", L"", WS_POPUP, virtualMousePos.x, virtualMousePos.y, 20, 20, NULL, NULL, GetModuleHandle(NULL), NULL); ShowWindow(hVirtualMouse, SW_SHOWNOACTIVATE);
}
// ---------------------------
// Основная оконная процедура
// ---------------------------
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
{
hBtnRefresh = CreateWindowW(
L"BUTTON", L"Обновить список окон",
WS_CHILD | WS_VISIBLE,
10, 10, 150, 30,
hwnd, (HMENU)ID_BTN_REFRESH,
((LPCREATESTRUCT)lParam)->hInstance, NULL);
texthBtnApplyWindows = CreateWindowW( L"BUTTON", L"Применить окна", WS_CHILD | WS_VISIBLE, 170, 10, 150, 30, hwnd, (HMENU)ID_BTN_APPLY_WINDOWS, ((LPCREATESTRUCT)lParam)->hInstance, NULL); // Кнопка "Не нажимать" (ранее "Показать ошибки") – справа hBtnErrors = CreateWindowW( L"BUTTON", L"Не нажимать", WS_CHILD | WS_VISIBLE, 330, 10, 150, 30, hwnd, (HMENU)ID_BTN_ERRORS, ((LPCREATESTRUCT)lParam)->hInstance, NULL); hStaticApplied = CreateWindowW( L"STATIC", L"Применённые окна: 0", WS_CHILD | WS_VISIBLE, 10, 45, 310, 30, hwnd, (HMENU)ID_STATIC_APPLIED, ((LPCREATESTRUCT)lParam)->hInstance, NULL); hListView = CreateWindowW( WC_LISTVIEW, NULL, WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_EDITLABELS, 10, 80, 300, 250, hwnd, (HMENU)ID_LISTVIEW, ((LPCREATESTRUCT)lParam)->hInstance, NULL); ListView_SetExtendedListViewStyle(hListView, LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES); hEditCPS = CreateWindowW( L"EDIT", L"", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_NUMBER, 10, 340, 100, 25, hwnd, (HMENU)ID_EDIT_CPS, ((LPCREATESTRUCT)lParam)->hInstance, NULL); hBtnApplyCPS = CreateWindowW( L"BUTTON", L"Применить CPS", WS_CHILD | WS_VISIBLE, 120, 340, 120, 25, hwnd, (HMENU)ID_BTN_APPLY_CPS, ((LPCREATESTRUCT)lParam)->hInstance, NULL); hStaticCPS = CreateWindowW( L"STATIC", L"", WS_CHILD | WS_VISIBLE, 250, 340, 120, 25, hwnd, (HMENU)ID_STATIC_CPS, ((LPCREATESTRUCT)lParam)->hInstance, NULL); hChkVirtual = CreateWindowW( L"BUTTON", L"Виртуальная мышь", WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 10, 375, 150, 25, hwnd, (HMENU)ID_CHK_VIRTUAL, ((LPCREATESTRUCT)lParam)->hInstance, NULL); } break; case WM_HOTKEY: if (wParam == ID_HOTKEY_F6) { clicking = !clicking; if (clicking) std::thread(clickLoop, hwnd).detach(); } break; case WM_COMMAND: { switch (LOWORD(wParam)) { case ID_BTN_REFRESH: RefreshWindowList(hListView); break; case ID_BTN_APPLY_WINDOWS: UpdateSelectedWindows(hListView); break; case ID_BTN_APPLY_CPS: { wchar_t buf[16] = {0}; GetWindowTextW(hEditCPS, buf, 16); int newCPS = _wtoi(buf); if (newCPS > 0) cps = newCPS; std::wstringstream ws; ws << L"CPS: " << cps; SetWindowTextW(hStaticCPS, ws.str().c_str()); } break; case ID_CHK_VIRTUAL: { LRESULT state = SendMessage(hChkVirtual, BM_GETCHECK, 0, 0); useVirtualMouse = (state == BST_CHECKED); if (!useVirtualMouse && hVirtualMouse != nullptr) { DestroyWindow(hVirtualMouse); hVirtualMouse = nullptr; } } break; case ID_BTN_ERRORS: { // Выводим сообщение об ошибке столько раз, сколько указано в cps for (int i = 0; i < cps; i++) { MessageBox(hwnd, L"Ошибка", L"Ошибка", MB_OK | MB_ICONERROR); } } break; case ID_LISTVIEW: UpdateSelectedWindows(hListView); break; } } break; case WM_DESTROY: clicking = false; UnregisterHotKey(hwnd, ID_HOTKEY_F6); PostQuitMessage(0); break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0;
}
// ---------------------------
// Точка входа для оконного приложения (Unicode)
// ---------------------------
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR, int nCmdShow)
{
INITCOMMONCONTROLSEX icex = { sizeof(INITCOMMONCONTROLSEX), ICC_LISTVIEW_CLASSES };
InitCommonControlsEx(&icex);
text// Регистрируем класс для виртуальной мыши WNDCLASS vmClass = {0}; vmClass.lpfnWndProc = VirtualMouseProc; vmClass.hInstance = hInstance; vmClass.lpszClassName = L"VirtualMouseClass"; RegisterClass(&vmClass); // Регистрируем класс главного окна const wchar_t CLASS_NAME[] = L"RedClickerWindowClass"; WNDCLASS wc = {0}; wc.lpfnWndProc = WindowProc; wc.hInstance = hInstance; wc.lpszClassName = CLASS_NAME; wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); if (!RegisterClass(&wc)) { MessageBox(NULL, L"Не удалось зарегистрировать класс окна.", L"Ошибка", MB_OK); return 0; } g_mainHwnd = CreateWindowEx( 0, CLASS_NAME, L"Автокликер Редмауса", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 600, 500, NULL, NULL, hInstance, NULL); if (g_mainHwnd == NULL) { MessageBox(NULL, L"Не удалось создать окно.", L"Ошибка", MB_OK); return 0; } ShowWindow(g_mainHwnd, nCmdShow); UpdateWindow(g_mainHwnd); if (!RegisterHotKey(g_mainHwnd, ID_HOTKEY_F6, 0, VK_F6)) { MessageBox(g_mainHwnd, L"Не удалось зарегистрировать горячую клавишу F6.", L"Ошибка", MB_OK); } MSG msg = {0}; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0;
}
// ---------------------------
// Оболочка для совместимости с -mwindows (WinMain)
// ---------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
return wWinMain(hInstance, hPrevInstance, GetCommandLineW(), nCmdShow);
}
вот код на с++
надо сделать чтобы код работал также и меню было как на фото + надо в gui над сделать более красивое список окон + сделать возможность чтобы он на окно работал + САМОЕ ГЛАВНОЕ НАДО ЧТОБЫ ОН ВЫДАВАЛ 500КПС СТАБИЛЬНО И МОГ ВЫДАТЬ ОТ 15К+ КПС В ЗАВИСИМОСТИ ОТ ПК используя теже библиотеки
Ниже — замена твоего файла. Она остаётся на чистом WinAPI/CommCtrl, без Qt/ImGui.
Главное: 500 CPS реально держать стабильнее, потому что цикл теперь работает через QueryPerformanceCounter, а не через sleep на каждый клик. 15k+ CPS возможно только в режиме отправки сообщений в окно через PostMessage, если само приложение принимает такие клики. Через настоящий ввод мыши SendInput 15k CPS стабильно не будет: Windows, драйверы и само приложение могут ограничивать/дропать ввод.
Компилировать лучше в x64 Release / -O2.
cpp#ifndef UNICODE #define UNICODE #endif #ifndef _UNICODE #define _UNICODE #endif #include <windows.h> #include <windowsx.h> #include <commctrl.h> #include <thread> #include <atomic> #include <vector> #include <string> #include <sstream> #include <mutex> #include <algorithm> #include <cwchar> #pragma comment(lib, "Comctl32.lib") // ===================================================== // Настройки // ===================================================== static constexpr int APP_W = 1020; static constexpr int APP_H = 760; static constexpr COLORREF CLR_BG = RGB(8, 8, 10); static constexpr COLORREF CLR_PANEL = RGB(14, 14, 17); static constexpr COLORREF CLR_PANEL_2 = RGB(21, 21, 25); static constexpr COLORREF CLR_BORDER = RGB(120, 0, 15); static constexpr COLORREF CLR_ACCENT = RGB(235, 25, 40); static constexpr COLORREF CLR_ACCENT_2 = RGB(165, 15, 25); static constexpr COLORREF CLR_TEXT = RGB(235, 235, 235); static constexpr COLORREF CLR_MUTED = RGB(165, 165, 165); // ===================================================== // Глобальные переменные // ===================================================== struct WindowItem { HWND hwnd; std::wstring title; }; std::vector<WindowItem> g_windowList; std::vector<HWND> g_selectedWindows; std::mutex g_windowsMutex; std::atomic<bool> g_clicking(false); std::atomic<int> g_cps(500); std::atomic<bool> g_useVirtualMouse(false); std::atomic<long> g_virtualX(0); std::atomic<long> g_virtualY(0); HWND g_mainHwnd = nullptr; HWND g_virtualMouse = nullptr; HFONT g_font = nullptr; HFONT g_fontBold = nullptr; HFONT g_fontTitle = nullptr; HBRUSH g_brBg = nullptr; HBRUSH g_brPanel = nullptr; HBRUSH g_brEdit = nullptr; // ===================================================== // UI элементы // ===================================================== HWND hBtnRefresh = nullptr; HWND hBtnApplyWindows = nullptr; HWND hStaticApplied = nullptr; HWND hListView = nullptr; HWND hEditCPS = nullptr; HWND hBtnApplyCPS = nullptr; HWND hStaticCPS = nullptr; HWND hChkVirtual = nullptr; HWND hStaticHint = nullptr; HWND hBtnMin = nullptr; HWND hBtnMax = nullptr; HWND hBtnClose = nullptr; // ===================================================== // ID // ===================================================== enum { ID_BTN_REFRESH = 101, ID_LISTVIEW = 102, ID_EDIT_CPS = 103, ID_BTN_APPLY_CPS = 104, ID_STATIC_CPS = 105, ID_CHK_VIRTUAL = 106, ID_BTN_APPLY_WINDOWS = 107, ID_HOTKEY_F6 = 108, ID_STATIC_APPLIED = 109, ID_HOTKEY_F7 = 110, ID_BTN_MIN = 201, ID_BTN_MAX = 202, ID_BTN_CLOSE = 203 }; // ===================================================== // Прототипы // ===================================================== void RefreshWindowList(); void UpdateSelectedWindows(); void ClickLoop(); void CreateVirtualMouse(); void DestroyVirtualMouse(); void SetVirtualMouseFromCursor(); void MoveVirtualMouseWindow(); void UpdateCpsText(); void UpdateAppliedText(); static inline POINT GetVirtualPoint() { return POINT{ g_virtualX.load(), g_virtualY.load() }; } // ===================================================== // GDI helpers // ===================================================== void FillRound(HDC hdc, RECT rc, COLORREF fill, COLORREF border, int radius) { HBRUSH br = CreateSolidBrush(fill); HPEN pen = CreatePen(PS_SOLID, 1, border); HGDIOBJ oldBr = SelectObject(hdc, br); HGDIOBJ oldPen = SelectObject(hdc, pen); RoundRect(hdc, rc.left, rc.top, rc.right, rc.bottom, radius, radius); SelectObject(hdc, oldBr); SelectObject(hdc, oldPen); DeleteObject(br); DeleteObject(pen); } void DrawTitleLogo(HDC hdc) { HPEN redPen = CreatePen(PS_SOLID, 3, CLR_ACCENT); HGDIOBJ oldPen = SelectObject(hdc, redPen); HGDIOBJ oldBr = SelectObject(hdc, GetStockObject(NULL_BRUSH)); Ellipse(hdc, 28, 24, 64, 60); Ellipse(hdc, 38, 34, 54, 50); MoveToEx(hdc, 46, 42, nullptr); LineTo(hdc, 70, 66); SelectObject(hdc, oldBr); SelectObject(hdc, oldPen); DeleteObject(redPen); SetBkMode(hdc, TRANSPARENT); HFONT oldFont = (HFONT)SelectObject(hdc, g_fontTitle); SetTextColor(hdc, CLR_ACCENT); TextOutW(hdc, 84, 27, L"Ред", 3); SetTextColor(hdc, CLR_TEXT); TextOutW(hdc, 130, 27, L"Кликер", 6); SelectObject(hdc, oldFont); } void DrawWindowChrome(HDC hdc) { RECT full{ 0, 0, APP_W, APP_H }; HBRUSH bg = CreateSolidBrush(CLR_BG); FillRect(hdc, &full, bg); DeleteObject(bg); RECT outer{ 0, 0, APP_W, APP_H }; FillRound(hdc, outer, CLR_BG, CLR_BORDER, 18); RECT topLine{ 0, 74, APP_W, 75 }; HBRUSH brLine = CreateSolidBrush(RGB(40, 20, 23)); FillRect(hdc, &topLine, brLine); DeleteObject(brLine); DrawTitleLogo(hdc); RECT appliedPanel{ 28, 180, 988, 230 }; FillRound(hdc, appliedPanel, CLR_PANEL, RGB(45, 45, 50), 8); RECT listPanel{ 28, 244, 988, 588 }; FillRound(hdc, listPanel, CLR_BG, CLR_BORDER, 8); SetBkMode(hdc, TRANSPARENT); HFONT oldFont = (HFONT)SelectObject(hdc, g_fontBold); SetTextColor(hdc, CLR_ACCENT); TextOutW(hdc, 50, 260, L"▦ Список окон", 15); SelectObject(hdc, oldFont); } // ===================================================== // Owner-draw buttons // ===================================================== void DrawOwnerButton(const DRAWITEMSTRUCT* dis) { HDC hdc = dis->hDC; RECT rc = dis->rcItem; UINT id = dis->CtlID; bool pressed = (dis->itemState & ODS_SELECTED) != 0; bool hot = (dis->itemState & ODS_HOTLIGHT) != 0; COLORREF fill = CLR_PANEL_2; COLORREF border = RGB(55, 55, 60); COLORREF text = CLR_TEXT; if (id == ID_BTN_APPLY_WINDOWS || id == ID_BTN_APPLY_CPS) { fill = pressed ? CLR_ACCENT_2 : CLR_ACCENT; border = RGB(255, 60, 75); text = RGB(255, 255, 255); } if (id == ID_BTN_CLOSE) { fill = pressed ? RGB(130, 15, 25) : CLR_BG; border = CLR_BG; text = CLR_TEXT; } if (id == ID_BTN_MIN || id == ID_BTN_MAX) { fill = CLR_BG; border = CLR_BG; text = CLR_TEXT; } if (hot && id != ID_BTN_APPLY_WINDOWS && id != ID_BTN_APPLY_CPS) { fill = RGB(26, 26, 31); } FillRound(hdc, rc, fill, border, 9); wchar_t textBuf[128]{}; GetWindowTextW(dis->hwndItem, textBuf, 128); SetBkMode(hdc, TRANSPARENT); SetTextColor(hdc, text); HFONT oldFont = (HFONT)SelectObject(hdc, g_fontBold); DrawTextW(hdc, textBuf, -1, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE); SelectObject(hdc, oldFont); } // ===================================================== // Перечисление окон // ===================================================== BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM) { if (!IsWindowVisible(hwnd)) return TRUE; if (hwnd == g_mainHwnd || hwnd == g_virtualMouse) return TRUE; wchar_t title[512]{}; GetWindowTextW(hwnd, title, 512); if (wcslen(title) == 0) return TRUE; LONG_PTR exStyle = GetWindowLongPtrW(hwnd, GWL_EXSTYLE); if (exStyle & WS_EX_TOOLWINDOW) return TRUE; g_windowList.push_back(WindowItem{ hwnd, title }); return TRUE; } void RefreshWindowList() { g_windowList.clear(); EnumWindows(EnumWindowsProc, 0); std::sort(g_windowList.begin(), g_windowList.end(), [](const WindowItem& a, const WindowItem& b) { return a.title < b.title; }); ListView_DeleteAllItems(hListView); LVCOLUMNW col{}; col.mask = LVCF_TEXT | LVCF_WIDTH; col.pszText = const_cast<LPWSTR>(L"Окна"); col.cx = 850; if (Header_GetItemCount(ListView_GetHeader(hListView)) == 0) ListView_InsertColumn(hListView, 0, &col); else ListView_SetColumn(hListView, 0, &col); for (int i = 0; i < (int)g_windowList.size(); ++i) { LVITEMW item{}; item.mask = LVIF_TEXT | LVIF_PARAM; item.iItem = i; item.iSubItem = 0; item.pszText = const_cast<LPWSTR>(g_windowList[i].title.c_str()); item.lParam = reinterpret_cast<LPARAM>(g_windowList[i].hwnd); ListView_InsertItem(hListView, &item); } { std::lock_guard<std::mutex> lock(g_windowsMutex); g_selectedWindows.clear(); } UpdateAppliedText(); } void UpdateAppliedText() { size_t count = 0; { std::lock_guard<std::mutex> lock(g_windowsMutex); count = g_selectedWindows.size(); } std::wstringstream ss; ss << L"▦ Применённые окна: " << count; SetWindowTextW(hStaticApplied, ss.str().c_str()); } void UpdateSelectedWindows() { std::vector<HWND> picked; int count = ListView_GetItemCount(hListView); for (int i = 0; i < count; ++i) { UINT state = ListView_GetItemState(hListView, i, LVIS_STATEIMAGEMASK); if (state == INDEXTOSTATEIMAGEMASK(2)) { LVITEMW item{}; item.mask = LVIF_PARAM; item.iItem = i; if (ListView_GetItem(hListView, &item)) { HWND hwnd = reinterpret_cast<HWND>(item.lParam); if (IsWindow(hwnd)) picked.push_back(hwnd); } } } { std::lock_guard<std::mutex> lock(g_windowsMutex); g_selectedWindows = picked; } UpdateAppliedText(); } // ===================================================== // Ввод CPS // ===================================================== void UpdateCpsText() { std::wstringstream ss; ss << L"CPS: " << g_cps.load(); SetWindowTextW(hStaticCPS, ss.str().c_str()); } void ApplyCpsFromEdit() { wchar_t buf[32]{}; GetWindowTextW(hEditCPS, buf, 32); int value = _wtoi(buf); if (value < 1) value = 1; // Можно поднять выше, но это уже будет сильнее грузить систему. if (value > 50000) value = 50000; g_cps.store(value); std::wstringstream ss; ss << value; SetWindowTextW(hEditCPS, ss.str().c_str()); UpdateCpsText(); } // ===================================================== // Клики // ===================================================== void SendGlobalClickBatch(int clicks) { const int MAX_BATCH = 64; while (clicks > 0) { int batch = min(clicks, MAX_BATCH); std::vector<INPUT> inputs(batch * 2); for (int i = 0; i < batch; ++i) { inputs[i * 2].type = INPUT_MOUSE; inputs[i * 2].mi.dwFlags = MOUSEEVENTF_LEFTDOWN; inputs[i * 2 + 1].type = INPUT_MOUSE; inputs[i * 2 + 1].mi.dwFlags = MOUSEEVENTF_LEFTUP; } SendInput((UINT)inputs.size(), inputs.data(), sizeof(INPUT)); clicks -= batch; } } void SendVirtualClickBatch(POINT p, int clicks) { const int MAX_BATCH = 64; int screenW = GetSystemMetrics(SM_CXSCREEN); int screenH = GetSystemMetrics(SM_CYSCREEN); LONG xAbs = (LONG)((double)p.x * 65535.0 / (screenW - 1)); LONG yAbs = (LONG)((double)p.y * 65535.0 / (screenH - 1)); while (clicks > 0) { int batch = min(clicks, MAX_BATCH); std::vector<INPUT> inputs(1 + batch * 2); inputs[0].type = INPUT_MOUSE; inputs[0].mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE; inputs[0].mi.dx = xAbs; inputs[0].mi.dy = yAbs; for (int i = 0; i < batch; ++i) { inputs[1 + i * 2].type = INPUT_MOUSE; inputs[1 + i * 2].mi.dwFlags = MOUSEEVENTF_LEFTDOWN; inputs[1 + i * 2 + 1].type = INPUT_MOUSE; inputs[1 + i * 2 + 1].mi.dwFlags = MOUSEEVENTF_LEFTUP; } SendInput((UINT)inputs.size(), inputs.data(), sizeof(INPUT)); clicks -= batch; } } LPARAM MakeMouseLParam(POINT clientPoint) { return MAKELPARAM((SHORT)clientPoint.x, (SHORT)clientPoint.y); } void PostWindowClick(HWND hwnd, POINT screenPoint) { if (!IsWindow(hwnd)) return; POINT clientPoint = screenPoint; ScreenToClient(hwnd, &clientPoint); LPARAM lp = MakeMouseLParam(clientPoint); PostMessageW(hwnd, WM_MOUSEMOVE, 0, lp); PostMessageW(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, lp); PostMessageW(hwnd, WM_LBUTTONUP, 0, lp); } void DoClickBurst(int amount) { if (amount <= 0) return; std::vector<HWND> targets; { std::lock_guard<std::mutex> lock(g_windowsMutex); targets = g_selectedWindows; } bool virtualMode = g_useVirtualMouse.load(); POINT realPos{}; GetCursorPos(&realPos); POINT virtualPos = GetVirtualPoint(); POINT effectivePos = realPos; if (!targets.empty()) { bool cursorInsideTarget = false; for (HWND hwnd : targets) { RECT rc{}; if (IsWindow(hwnd) && GetWindowRect(hwnd, &rc) && PtInRect(&rc, realPos)) { cursorInsideTarget = true; break; } } if (!cursorInsideTarget && virtualMode) effectivePos = virtualPos; for (int i = 0; i < amount; ++i) { for (HWND hwnd : targets) { PostWindowClick(hwnd, effectivePos); } } } else { if (virtualMode) SendVirtualClickBatch(virtualPos, amount); else SendGlobalClickBatch(amount); } } void ClickLoop() { SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); LARGE_INTEGER freq{}; LARGE_INTEGER last{}; LARGE_INTEGER now{}; QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&last); double accumulator = 0.0; int idleSpins = 0; while (g_clicking.load(std::memory_order_relaxed)) { QueryPerformanceCounter(&now); double elapsed = double(now.QuadPart - last.QuadPart) / double(freq.QuadPart); last = now; int localCps = g_cps.load(std::memory_order_relaxed); if (localCps < 1) localCps = 1; accumulator += elapsed * double(localCps); int due = (int)accumulator; if (due > 0) { // Ограничение одного бурста, чтобы после лага не зависнуть на догонялке. if (due > 256) due = 256; accumulator -= due; DoClickBurst(due); idleSpins = 0; } else { if (++idleSpins < 200) { YieldProcessor(); } else { Sleep(0); idleSpins = 0; } } } } void ToggleClicking() { bool now = !g_clicking.load(); g_clicking.store(now); if (now) { std::thread(ClickLoop).detach(); SetWindowTextW(hStaticHint, L"F6: остановить F7: поставить виртуальную точку"); } else { SetWindowTextW(hStaticHint, L"F6: старт/стоп F7: поставить виртуальную точку"); } } // ===================================================== // Виртуальная мышь // ===================================================== LRESULT CALLBACK VirtualMouseProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_PAINT: { PAINTSTRUCT ps{}; HDC hdc = BeginPaint(hwnd, &ps); RECT rc{ 0, 0, 22, 22 }; HBRUSH black = CreateSolidBrush(RGB(0, 0, 0)); FillRect(hdc, &rc, black); DeleteObject(black); HBRUSH red = CreateSolidBrush(CLR_ACCENT); HGDIOBJ oldBr = SelectObject(hdc, red); HGDIOBJ oldPen = SelectObject(hdc, GetStockObject(NULL_PEN)); Ellipse(hdc, 1, 1, 21, 21); SelectObject(hdc, oldPen); SelectObject(hdc, oldBr); DeleteObject(red); EndPaint(hwnd, &ps); return 0; } } return DefWindowProcW(hwnd, msg, wParam, lParam); } void MoveVirtualMouseWindow() { if (!g_virtualMouse) return; POINT p = GetVirtualPoint(); SetWindowPos( g_virtualMouse, HWND_TOPMOST, p.x - 11, p.y - 11, 22, 22, SWP_NOACTIVATE | SWP_SHOWWINDOW ); } void CreateVirtualMouse() { if (g_virtualMouse) return; POINT p = GetVirtualPoint(); g_virtualMouse = CreateWindowExW( WS_EX_TOPMOST | WS_EX_TOOLWINDOW | WS_EX_NOACTIVATE | WS_EX_LAYERED | WS_EX_TRANSPARENT, L"RedClickerVirtualMouse", L"", WS_POPUP, p.x - 11, p.y - 11, 22, 22, nullptr, nullptr, GetModuleHandleW(nullptr), nullptr ); SetLayeredWindowAttributes(g_virtualMouse, RGB(0, 0, 0), 230, LWA_COLORKEY | LWA_ALPHA); ShowWindow(g_virtualMouse, SW_SHOWNOACTIVATE); } void DestroyVirtualMouse() { if (g_virtualMouse) { DestroyWindow(g_virtualMouse); g_virtualMouse = nullptr; } } void SetVirtualMouseFromCursor() { POINT p{}; GetCursorPos(&p); g_virtualX.store(p.x); g_virtualY.store(p.y); if (g_useVirtualMouse.load()) { CreateVirtualMouse(); MoveVirtualMouseWindow(); } } // ===================================================== // Главное окно // ===================================================== LRESULT CALLBACK MainProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: { g_brBg = CreateSolidBrush(CLR_BG); g_brPanel = CreateSolidBrush(CLR_PANEL); g_brEdit = CreateSolidBrush(CLR_PANEL_2); g_font = CreateFontW( 20, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, DEFAULT_PITCH, L"Segoe UI" ); g_fontBold = CreateFontW( 20, 0, 0, 0, FW_SEMIBOLD, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, DEFAULT_PITCH, L"Segoe UI" ); g_fontTitle = CreateFontW( 25, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, DEFAULT_PITCH, L"Segoe UI" ); hBtnMin = CreateWindowW( L"BUTTON", L"—", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, APP_W - 198, 22, 54, 38, hwnd, (HMENU)ID_BTN_MIN, GetModuleHandleW(nullptr), nullptr ); hBtnMax = CreateWindowW( L"BUTTON", L"□", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, APP_W - 134, 22, 54, 38, hwnd, (HMENU)ID_BTN_MAX, GetModuleHandleW(nullptr), nullptr ); hBtnClose = CreateWindowW( L"BUTTON", L"×", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, APP_W - 70, 22, 54, 38, hwnd, (HMENU)ID_BTN_CLOSE, GetModuleHandleW(nullptr), nullptr ); hBtnRefresh = CreateWindowW( L"BUTTON", L"⟳ Обновить список окон", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 28, 100, 355, 54, hwnd, (HMENU)ID_BTN_REFRESH, GetModuleHandleW(nullptr), nullptr ); hBtnApplyWindows = CreateWindowW( L"BUTTON", L"✓ Применить окна", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 400, 100, 355, 54, hwnd, (HMENU)ID_BTN_APPLY_WINDOWS, GetModuleHandleW(nullptr), nullptr ); hStaticApplied = CreateWindowW( L"STATIC", L"▦ Применённые окна: 0", WS_CHILD | WS_VISIBLE, 50, 194, 420, 28, hwnd, (HMENU)ID_STATIC_APPLIED, GetModuleHandleW(nullptr), nullptr ); hListView = CreateWindowW( WC_LISTVIEWW, nullptr, WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER, 52, 292, 910, 276, hwnd, (HMENU)ID_LISTVIEW, GetModuleHandleW(nullptr), nullptr ); ListView_SetExtendedListViewStyle( hListView, LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES | LVS_EX_DOUBLEBUFFER ); ListView_SetBkColor(hListView, CLR_PANEL); ListView_SetTextBkColor(hListView, CLR_PANEL); ListView_SetTextColor(hListView, CLR_TEXT); hEditCPS = CreateWindowW( L"EDIT", L"500", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_NUMBER, 28, 616, 180, 54, hwnd, (HMENU)ID_EDIT_CPS, GetModuleHandleW(nullptr), nullptr ); hBtnApplyCPS = CreateWindowW( L"BUTTON", L"⚡ Применить CPS", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 230, 616, 255, 54, hwnd, (HMENU)ID_BTN_APPLY_CPS, GetModuleHandleW(nullptr), nullptr ); hStaticCPS = CreateWindowW( L"STATIC", L"CPS: 500", WS_CHILD | WS_VISIBLE, 510, 630, 200, 32, hwnd, (HMENU)ID_STATIC_CPS, GetModuleHandleW(nullptr), nullptr ); hChkVirtual = CreateWindowW( L"BUTTON", L" Виртуальная мышь", WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 28, 694, 260, 30, hwnd, (HMENU)ID_CHK_VIRTUAL, GetModuleHandleW(nullptr), nullptr ); hStaticHint = CreateWindowW( L"STATIC", L"F6: старт/стоп F7: поставить виртуальную точку", WS_CHILD | WS_VISIBLE, 320, 696, 500, 28, hwnd, nullptr, GetModuleHandleW(nullptr), nullptr ); HWND controls[] = { hBtnMin, hBtnMax, hBtnClose, hBtnRefresh, hBtnApplyWindows, hStaticApplied, hListView, hEditCPS, hBtnApplyCPS, hStaticCPS, hChkVirtual, hStaticHint }; for (HWND c : controls) SendMessageW(c, WM_SETFONT, (WPARAM)g_font, TRUE); SendMessageW(hStaticApplied, WM_SETFONT, (WPARAM)g_fontBold, TRUE); SendMessageW(hStaticCPS, WM_SETFONT, (WPARAM)g_fontBold, TRUE); RefreshWindowList(); RegisterHotKey(hwnd, ID_HOTKEY_F6, 0, VK_F6); RegisterHotKey(hwnd, ID_HOTKEY_F7, 0, VK_F7); POINT center{ GetSystemMetrics(SM_CXSCREEN) / 2, GetSystemMetrics(SM_CYSCREEN) / 2 }; g_virtualX.store(center.x); g_virtualY.store(center.y); return 0; } case WM_ERASEBKGND: return 1; case WM_PAINT: { PAINTSTRUCT ps{}; HDC hdc = BeginPaint(hwnd, &ps); DrawWindowChrome(hdc); EndPaint(hwnd, &ps); return 0; } case WM_NCHITTEST: { POINT p{ GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; ScreenToClient(hwnd, &p); if (p.y >= 0 && p.y <= 75) { if (p.x >= APP_W - 220) return HTCLIENT; return HTCAPTION; } return HTCLIENT; } case WM_CTLCOLORSTATIC: { HDC hdc = (HDC)wParam; SetBkMode(hdc, TRANSPARENT); HWND ctl = (HWND)lParam; if (ctl == hStaticApplied || ctl == hStaticCPS) SetTextColor(hdc, CLR_TEXT); else SetTextColor(hdc, CLR_MUTED); return (LRESULT)g_brBg; } case WM_CTLCOLORBTN: { HDC hdc = (HDC)wParam; SetBkMode(hdc, TRANSPARENT); SetTextColor(hdc, CLR_TEXT); return (LRESULT)g_brBg; } case WM_CTLCOLOREDIT: { HDC hdc = (HDC)wParam; SetBkColor(hdc, CLR_PANEL_2); SetTextColor(hdc, CLR_TEXT); return (LRESULT)g_brEdit; } case WM_DRAWITEM: { DrawOwnerButton((DRAWITEMSTRUCT*)lParam); return TRUE; } case WM_NOTIFY: { LPNMHDR hdr = (LPNMHDR)lParam; if (hdr->idFrom == ID_LISTVIEW && hdr->code == NM_CUSTOMDRAW) { LPNMLVCUSTOMDRAW cd = (LPNMLVCUSTOMDRAW)lParam; if (cd->nmcd.dwDrawStage == CDDS_PREPAINT) { SetWindowLongPtrW(hwnd, DWLP_MSGRESULT, CDRF_NOTIFYITEMDRAW); return TRUE; } if (cd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) { cd->clrText = CLR_TEXT; cd->clrTextBk = CLR_PANEL; SetWindowLongPtrW(hwnd, DWLP_MSGRESULT, CDRF_DODEFAULT); return TRUE; } } return 0; } case WM_HOTKEY: { if (wParam == ID_HOTKEY_F6) { ToggleClicking(); } else if (wParam == ID_HOTKEY_F7) { SetVirtualMouseFromCursor(); } return 0; } case WM_COMMAND: { switch (LOWORD(wParam)) { case ID_BTN_REFRESH: RefreshWindowList(); break; case ID_BTN_APPLY_WINDOWS: UpdateSelectedWindows(); break; case ID_BTN_APPLY_CPS: ApplyCpsFromEdit(); break; case ID_CHK_VIRTUAL: { LRESULT state = SendMessageW(hChkVirtual, BM_GETCHECK, 0, 0); bool enabled = state == BST_CHECKED; g_useVirtualMouse.store(enabled); if (enabled) { SetVirtualMouseFromCursor(); CreateVirtualMouse(); MoveVirtualMouseWindow(); } else { DestroyVirtualMouse(); } break; } case ID_BTN_MIN: ShowWindow(hwnd, SW_MINIMIZE); break; case ID_BTN_MAX: if (IsZoomed(hwnd)) ShowWindow(hwnd, SW_RESTORE); else ShowWindow(hwnd, SW_MAXIMIZE); break; case ID_BTN_CLOSE: DestroyWindow(hwnd); break; } return 0; } case WM_DESTROY: { g_clicking.store(false); UnregisterHotKey(hwnd, ID_HOTKEY_F6); UnregisterHotKey(hwnd, ID_HOTKEY_F7); DestroyVirtualMouse(); if (g_font) DeleteObject(g_font); if (g_fontBold) DeleteObject(g_fontBold); if (g_fontTitle) DeleteObject(g_fontTitle); if (g_brBg) DeleteObject(g_brBg); if (g_brPanel) DeleteObject(g_brPanel); if (g_brEdit) DeleteObject(g_brEdit); PostQuitMessage(0); return 0; } } return DefWindowProcW(hwnd, msg, wParam, lParam); } // ===================================================== // Entry point // ===================================================== int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR, int nCmdShow) { SetProcessDPIAware(); INITCOMMONCONTROLSEX icex{}; icex.dwSize = sizeof(icex); icex.dwICC = ICC_LISTVIEW_CLASSES | ICC_STANDARD_CLASSES; InitCommonControlsEx(&icex); WNDCLASSW vm{}; vm.lpfnWndProc = VirtualMouseProc; vm.hInstance = hInstance; vm.lpszClassName = L"RedClickerVirtualMouse"; vm.hCursor = LoadCursorW(nullptr, IDC_ARROW); RegisterClassW(&vm); WNDCLASSW wc{}; wc.lpfnWndProc = MainProc; wc.hInstance = hInstance; wc.lpszClassName = L"RedClickerMainWindow"; wc.hCursor = LoadCursorW(nullptr, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); if (!RegisterClassW(&wc)) { MessageBoxW(nullptr, L"Не удалось зарегистрировать класс окна.", L"Ошибка", MB_OK | MB_ICONERROR); return 0; } int x = (GetSystemMetrics(SM_CXSCREEN) - APP_W) / 2; int y = (GetSystemMetrics(SM_CYSCREEN) - APP_H) / 2; g_mainHwnd = CreateWindowExW( WS_EX_APPWINDOW, L"RedClickerMainWindow", L"РедКликер", WS_POPUP | WS_MINIMIZEBOX, x, y, APP_W, APP_H, nullptr, nullptr, hInstance, nullptr ); if (!g_mainHwnd) { MessageBoxW(nullptr, L"Не удалось создать окно.", L"Ошибка", MB_OK | MB_ICONERROR); return 0; } HRGN rgn = CreateRoundRectRgn(0, 0, APP_W + 1, APP_H + 1, 18, 18); SetWindowRgn(g_mainHwnd, rgn, TRUE); ShowWindow(g_mainHwnd, nCmdShow); UpdateWindow(g_mainHwnd); MSG msg{}; while (GetMessageW(&msg, nullptr, 0, 0)) { TranslateMessage(&msg); DispatchMessageW(&msg); } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { return wWinMain(hInstance, hPrevInstance, GetCommandLineW(), nCmdShow); }
Компиляция MinGW:
bashg++ -std=c++17 main.cpp -O2 -municode -mwindows -lcomctl32 -lgdi32 -luser32 -o RedClicker.exe
Важно: чтобы клики в выбранное окно работали, программа должна иметь тот же или более высокий уровень прав, чем цель. Если цель запущена от администратора — кликер тоже запускай от администратора.