rage mp рандомно название окна меняет, там по другому надоКак можно такое реализовать в Rage MP? Я пишу вместо gta sa GTAV (название основного приложения с гташкой) и не работает
rage mp рандомно название окна меняет, там по другому надоКак можно такое реализовать в Rage MP? Я пишу вместо gta sa GTAV (название основного приложения с гташкой) и не работает
daНазвание окна, должно быть 1:1, а так хукай wndproc, помощь в этом нужна?
можно просто в центр кликать, если окно не известно
HWND hwnd = GetForegroundWindow(); // дескриптор окна
// далее получаем размеры окна
RECT rect;
GetClientRect(hwnd, &rect);
int centerX = (rect.right - rect.left) / 2; // Х центра
int centerY = (rect.bottom - rect.top) / 2; // Y центра
// нажимаем
SendMessage(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(centerX, centerY));
SendMessage(hwnd, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(centerX, centerY));
ну в общем написал вот такой код:Как можно такое реализовать в Rage MP? Я пишу вместо gta sa GTAV (название основного приложения с гташкой) и не работает
#include "mHook.hpp"
LRESULT CALLBACK HookMouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (wParam == WM_LBUTTONUP) {
std::cout << "click" << std::endl;
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
DWORD GetProcessIdByName(const char* process_name) {
PROCESSENTRY32 processEntry;
processEntry.dwSize = sizeof(PROCESSENTRY32);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (snapshot == INVALID_HANDLE_VALUE) {
std::cerr << "failed to create process snapshot" << std::endl;
return 0;
}
if (!Process32First(snapshot, &processEntry)) {
std::cerr << "failed to get the first process" << std::endl;
CloseHandle(snapshot);
return 0;
}
DWORD processId = 0;
while (Process32Next(snapshot, &processEntry)) {
if (strcmp(processEntry.szExeFile, process_name) == 0) {
processId = processEntry.th32ProcessID;
break;
}
}
CloseHandle(snapshot);
return processId;
}
#pragma once
#include "main.hpp"
LRESULT CALLBACK HookMouseProc(int nCode, WPARAM wParam, LPARAM lParam);
DWORD GetProcessIdByName(const char* process_name);
#include "main.hpp"
int main() {
HHOOK hook_mouse = SetWindowsHookExA(WH_MOUSE_LL, HookMouseProc, NULL, NULL);
if (hook_mouse == NULL) {
return 1;
}
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWindowsHookEx(hook_mouse);
return 0;
}
#pragma once
#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
#include "mHook.hpp"
SetWindowsHookExA(WH_MOUSE_LL, HookMouseProc, NULL, 0);
if (hook_mouse == NULL) {
return 1;
}
std::cout << "click" << std::endl;
DWORD GetProcessIdByName(const char* process_name);
#include "pch.h"
#include <windows.h>
#include <stdio.h>
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
if (fdwReason == DLL_PROCESS_ATTACH)
{
HWND hwnd = FindWindow(NULL, L"GTA:SA:MP");
if (hwnd == NULL)
return FALSE;
SetWindowText(hwnd, L"GTA:NewText");
//debug
MessageBox(NULL, L"ASI initialization successful!", L"Success", MB_OK);
FILE* f;
fopen_s(&f, "SetWindowText.log", "a");
fprintf(f, "Success\n");
fclose(f);
}
return TRUE;
}
в dll_process_attach в твоём случае чтобы исполнить код который ты хочешь нужно ставить инициализацию функции где будет лежать код который тебе надо, и инициализироваться он должен обязательно через:Возникла необходимость смены Window Text после инициализации.
Сделал вот так, не работает, кто подскажет в чём может быть проблема? И где моя ошибка
с++:#include "pch.h" #include <windows.h> #include <stdio.h> BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { if (fdwReason == DLL_PROCESS_ATTACH) { HWND hwnd = FindWindow(NULL, L"GTA:SA:MP"); if (hwnd == NULL) return FALSE; SetWindowText(hwnd, L"GTA:NewText"); //debug MessageBox(NULL, L"ASI initialization successful!", L"Success", MB_OK); FILE* f; fopen_s(&f, "SetWindowText.log", "a"); fprintf(f, "Success\n"); fclose(f); } return TRUE; }
std::thread(name_func).detach();
#include <windows.h>
#include <stdio.h>
#include <thread>
#include <iostream>
bool func() {
HWND hwnd = FindWindowA(nullptr, "GTA:SA:MP");
if (hwnd == NULL) {
MessageBoxA(nullptr, "ПИЗДЕЦ НАХУЙ", "ПИЗДЕЦ", MB_OK);
return true;
}
SetWindowTextA(hwnd, "GTA:NewText");
MessageBoxA(nullptr, "ASI initialization successful!", "Success", MB_OK);
FILE* f;
fopen_s(&f, "SetWindowText.log", "a");
fprintf(f, "Success\n");
fclose(f);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
if (fdwReason == DLL_PROCESS_ATTACH)
{
std::thread(func).detach();
}
return TRUE;
}
До инициализации игры у окна другое название, поэтому плагин и не может найти GTA:SA:MP. Дожидайся загрузки игры например хуком CTimer::Update и уже тогда делай поиск по названию окна.Возникла необходимость смены Window Text после инициализации.
Сделал вот так, не работает, кто подскажет в чём может быть проблема? И где моя ошибка
с++:#include "pch.h" #include <windows.h> #include <stdio.h> BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { if (fdwReason == DLL_PROCESS_ATTACH) { HWND hwnd = FindWindow(NULL, L"GTA:SA:MP"); if (hwnd == NULL) return FALSE; SetWindowText(hwnd, L"GTA:NewText"); //debug MessageBox(NULL, L"ASI initialization successful!", L"Success", MB_OK); FILE* f; fopen_s(&f, "SetWindowText.log", "a"); fprintf(f, "Success\n"); fclose(f); } return TRUE; }
и получить гонку потоков, не найденное окно, потому что там будет Grand Theft Auto: San Andreas, а не GTA:SAMPв dll_process_attach в твоём случае чтобы исполнить код который ты хочешь нужно ставить инициализацию функции где будет лежать код который тебе надо, и инициализироваться он должен обязательно через:
вот тебе пример:C++:std::thread(name_func).detach();
C++:#include <windows.h> #include <stdio.h> #include <thread> #include <iostream> bool func() { HWND hwnd = FindWindowA(nullptr, "GTA:SA:MP"); if (hwnd == NULL) { MessageBoxA(nullptr, "ПИЗДЕЦ НАХУЙ", "ПИЗДЕЦ", MB_OK); return true; } SetWindowTextA(hwnd, "GTA:NewText"); MessageBoxA(nullptr, "ASI initialization successful!", "Success", MB_OK); FILE* f; fopen_s(&f, "SetWindowText.log", "a"); fprintf(f, "Success\n"); fclose(f); } BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { if (fdwReason == DLL_PROCESS_ATTACH) { std::thread(func).detach(); } return TRUE; }
А можно просто HWND окна из памяти игры дернуть...До инициализации игры у окна другое название, поэтому плагин и не может найти GTA:SA:MP. Дожидайся загрузки игры например хуком CTimer::Update и уже тогда делай поиск по названию окна.
я рассчитывал на то, что он будет инжектить .dll вручную, а ему оказывается .asi нужнои получить гонку потоков, не найденное окно, потому что там будет Grand Theft Auto: San Andreas, а не GTA:SAMP
Ты не установишь его на 5ку потому что у тебя будет всего 0, 1, 2, 3. Нужно будет как минимум пересоздавать массив.Как прямо в таблице изменить местоположение какому-то элементу? Тоесть. К примеру есть массив:
И внутри массива мне надо присвоить первому элементу местоположение 5.C++:const char table[] = {'n', 'e', 'g', 'r'}
Указав вручную диапозон массива, можно будет так сделать?Ты не установишь его на 5ку потому что у тебя будет всего 0, 1, 2, 3. Нужно будет как минимум пересоздавать массив.
Размер обычного массива в плюсах менять нельзя. Вроде как только размер динамичесского можно менять как-тоУказав вручную диапозон массива, можно будет так сделать?
Я имел ввиду не менять, а сразу указать. Типо этого:Размер обычного массива в плюсах менять нельзя. Вроде как только размер динамичесского можно менять как-то
const char table[10] = {'n', 'e', 'g', 'r'}