Другое С/С++ Вопрос - Ответ

Jack_Savage

Участник
150
17
Как можно инжектнуть samp.dll в уже запущенную игру ?
То есть самп инжектится при старте процесса gta_sa.
А можно как то инжектить его уже после того как игра запустилась и показала меню ?
 

kawa operand

перерывпятьминут
602
333
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
samp.dll должен загрузиться до показа окна
 

w0odcr3st

Новичок
14
1
Как можно выполнить команду или послать сообщение серверу через sampfuncs?
 

Nika23830

Новичок
11
3
1.Ваш вопрос: Как выдать сообщение при загрузке? Которые показываются перед "Connected. Joining the game..."
 

Jack_Savage

Участник
150
17
Как игра лочит мышку ?
PS: Хукал SetCursorPos и все равно не мог двигать мышкой
 

Nika23830

Новичок
11
3
В проекте есть пример вывода сообщения в чат, при входе в игру.
Можете все равно пожалуйста сюда кинуть код для примера, я нуб :ССС
1.Ваш вопрос: Как выдать сообщение при загрузке? Которые показываются перед "Connected. Joining the game..."
 
1,417
1,042
Можете все равно пожалуйста сюда кинуть код для примера, я нуб :ССС
C++:
#include <windows.h>
#include <string>
#include <assert.h>
#include <process.h>

#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"

SAMPFUNCS *SF = new SAMPFUNCS();

void CALLBACK mainloop()
{
    static bool init = false;
    if (!init)
    {
        if (GAME == nullptr)
            return;
        if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)
            return;
        if (!SF->getSAMP()->IsInitialized())
            return;
        SF->getSAMP()->getChat()->AddChatMessage( D3DCOLOR_XRGB( 0, 0xAA, 0 ), "SAMPFUNCS Plugin loaded." );

        init = true;
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    switch (dwReasonForCall)
    {
        case DLL_PROCESS_ATTACH:
            SF->initPlugin(mainloop, hModule);
            break;
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}
 

iAmerican

Известный
Друг
611
261
Хукаю WndProc ..
C++:
WNDPROC                    hOrigProc = NULL;
hOrigProc = (WNDPROC)SetWindowLong(*(HWND*)0xC97C1C, GWL_WNDPROC, (LONG)(UINT_PTR)WndProc);
C++:
bool __stdcall WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if (uMsg == WM_KEYDOWN)
    {
        pSAMP->addMessageToChat(-1, "%i", wParam);
        if (wParam == 192) { // 192 - ®
            pSAMP->say("/CMD");
            return false;
        }
    }
    return true;
}
Получается если я жму "~" , открывается чат сампа , мне надо сделать что бы он не открывался , а отправлялась команда.
Когда захожу в самп , я получаю нажатые клавиши , но перестают реагировать клавиши.
 

kawa operand

перерывпятьминут
602
333
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

iAmerican

Известный
Друг
611
261
C++:
CallWindowProc(hOrigProc, hWnd, uMsg, wParam, lParam);

и ваще он вот так выглядит

C++:
LRESULT CALLBACK WindowProc(
  _In_ HWND   hwnd,
  _In_ UINT   uMsg,
  _In_ WPARAM wParam,
  _In_ LPARAM lParam
);
И так и так пробовал , если сделать так , то клавиши работают , но всё равно чат открывается.
C++:
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if (uMsg == WM_KEYDOWN) {
        if (wParam == 192) {
     
            pSAMP->say("/CMD");
            return false;
                                         }
    }
    return CallWindowProcA((WNDPROC)hOrigProc, hWnd, uMsg, wParam, lParam);
}
В SF этого хватало
C++:
bool __stdcall wndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if (uMsg == WM_KEYDOWN)
    {
       
          
                if (wParam == 192) { // 192 - ®
                    SF->getSAMP()->getPlayers()->pLocalPlayer->Say("/CMD");
                    return false;
                
            
        }
    }
    return true;
}
 

san0

Известный
Друг
412
275
И так и так пробовал , если сделать так , то клавиши работают , но всё равно чат открывается.
1) Попробуй SetWindowLong после того, как по адресу samp.dll + 0x119CB8 (4 байта) будет что-то больше 0. Это означает, что самп уже установил новый адрес процедуры диалогового окна для своих нужд. Это значение еще SF модифицирует, так для справки.
2) TRUE != true (BOOL != BOOLEAN), и в специфических условиях это может работать по другому.
C++:
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if (uMsg == WM_CHAR && wParam == '`') {
        // .. //
        return FALSE;
    }
    return CallWindowProc(hOrigProc, hWnd, uMsg, wParam, lParam);
}
3) Вместо всего этого WndProc лишь для игнорирования одной клавиши попробуй 5 байт занопить по адресу samp.dll + 0x5DAFD.
4) Проверял это с открытием чата на 'T', у меня нет тильды ))))