Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编辑DLL代码。使用ESC在游戏中启用功能_C - Fatal编程技术网

编辑DLL代码。使用ESC在游戏中启用功能

编辑DLL代码。使用ESC在游戏中启用功能,c,C,我这里有一个代码,我想放一个键来启用和禁用WSAD 函数是直接进行的,因此不可能在游戏中写入。我想使用ESC键激活和停用 救命!请??? #include <windows.h> HMODULE origLibrary; WNDPROC wndProc; typedef void (*_PushLetter) (int Letter); _PushLetter PushLetter; bool isOnline() { return (*(DWORD*) 0x7

我这里有一个代码,我想放一个键来启用和禁用WSAD

函数是直接进行的,因此不可能在游戏中写入。我想使用ESC键激活和停用

救命!请???

    #include <windows.h>

HMODULE origLibrary;
WNDPROC wndProc;

typedef void (*_PushLetter) (int Letter);
_PushLetter PushLetter;

bool isOnline() {
    return (*(DWORD*) 0x79CF28) == 8;
}

LRESULT CALLBACK HookedMessageDispatcher(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    if (!isOnline()) {
        return CallWindowProc(wndProc, hWnd, uMsg, wParam, lParam);
    }

    switch (uMsg) {
        case WM_KEYDOWN:
        {
            switch (wParam) {
                case 0x57:
                {
                    wParam = VK_UP;
                    break;
                }
                case 0x53:
                {
                    wParam = VK_DOWN;
                    break;
                }
                case 0x41:
                {
                    wParam = VK_LEFT;
                    break;
                }
                case 0x44:
                {
                    wParam = VK_RIGHT;
                    break;
                }
            }

            return CallWindowProc(wndProc, hWnd, uMsg, wParam, lParam);
        }
        default:
        {
            return CallWindowProc(wndProc, hWnd, uMsg, wParam, lParam);
        }
    }

    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

HWND WINAPI HookedCreateWindowEx(DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam) {
    HWND m_hWnd = CreateWindowEx(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
    wndProc = (WNDPROC) GetWindowLongPtr(m_hWnd, GWL_WNDPROC);
    SetWindowLongPtr(m_hWnd, GWL_WNDPROC, (LONG_PTR) HookedMessageDispatcher);

    return m_hWnd;
}

/*_cdecl */void _stdcall HookedPushLetter(int Letter) {
    if (!isOnline()) {
        PushLetter(Letter);
        return;
    }

    if (Letter == 'A' || Letter == 'a') {
        return;
    }

    if (Letter == 'W' || Letter == 'w') {
        return;
    }

    if (Letter == 'S' || Letter == 's') {
        return;
    }

    if (Letter == 'D' || Letter == 'd') {
        return;
    }

    PushLetter(Letter);
}

void HookCall(DWORD dwCallAddress, DWORD dwNewAddress) {
    DWORD dwOldProtect, dwNewProtect, dwNewCall;
    BYTE call[4];

    dwNewCall = dwNewAddress - dwCallAddress - 5;
    *(DWORD*) call = dwNewCall;

    VirtualProtect((LPVOID) (dwCallAddress + 1), 4, PAGE_EXECUTE_WRITECOPY, &dwOldProtect);
    dwCallAddress += 1;
    *(DWORD*) dwCallAddress = *(DWORD*) & call;
    VirtualProtect((LPVOID) (dwCallAddress), 5, dwOldProtect, &dwNewProtect);
}

static int InitMain() {
    char systemDirectory[MAX_PATH];
    GetSystemDirectory(systemDirectory, MAX_PATH);
    lstrcat(systemDirectory, "\\ddraw.dll");
    origLibrary = LoadLibrary(systemDirectory);

    if (!origLibrary) {
        exit(-1);
    }

    PushLetter = (_PushLetter) 0x458200;
    HookCall(0x4CFB8A, (DWORD) & HookedPushLetter);

    DWORD dwOldProtect, dwNewProtect, funcAddress, origAddress;
    funcAddress = (DWORD) & HookedCreateWindowEx;
    origAddress = (DWORD) ((int*) 0x5B8574);
    VirtualProtect((LPVOID) origAddress, 4, PAGE_READWRITE, &dwOldProtect);
    memcpy((LPVOID) origAddress, &funcAddress, 4);
    VirtualProtect((LPVOID) origAddress, 4, dwOldProtect, &dwNewProtect);

    return 1;
}

extern "C" {

    __declspec (dllexport) HRESULT WINAPI DirectDrawCreate(void* lpGUID, void* lplp, void* pUnkOuter) {
        FARPROC proc = GetProcAddress(origLibrary, "DirectDrawCreate");
        if (!proc)
            return E_INVALIDARG;

        return ((HRESULT(WINAPI *)(void*, void*, void*))(DWORD) (proc))(lpGUID, lplp, pUnkOuter);
    }

    BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) {
        switch (dwReason) {
            case DLL_PROCESS_ATTACH:
                return InitMain();
            case DLL_THREAD_ATTACH:
            case DLL_THREAD_DETACH:
            case DLL_PROCESS_DETACH:
                break;
        }

        return 1;
    }
}
#包括
HMODULE origLibrary;
WNDPROC WNDPROC;
typedef void(*_-PushLetter)(内部字母);
_印刷信印刷信;
bool isOnline(){
返回(*(DWORD*)0x79CF28)==8;
}
LRESULT回调HookedMessageDispatcher(HWND HWND、UINT uMsg、WPARAM WPARAM、LPARAM LPARAM){
如果(!isOnline()){
返回CallWindowProc(wndProc、hWnd、uMsg、wParam、lParam);
}
开关(uMsg){
案例WM_键控:
{
交换机(wParam){
案例0x57:
{
wParam=VK_UP;
打破
}
案例0x53:
{
wParam=VK_向下;
打破
}
案例0x41:
{
wParam=VK_左;
打破
}
案例0x44:
{
wParam=VK_右;
打破
}
}
返回CallWindowProc(wndProc、hWnd、uMsg、wParam、lParam);
}
违约:
{
返回CallWindowProc(wndProc、hWnd、uMsg、wParam、lParam);
}
}
返回DefWindowProc(hWnd、uMsg、wParam、lParam);
}
HWND WINAPI HookedCreateWindowEx(DWORD dwExStyle、LPCTSTR lpClassName、LPCTSTR lpWindowName、DWORD dwStyle、int x、int y、int nWidth、int nHeight、HWND hWndParent、HMENU-HMENU、HINSTANCE HINSTANCE、LPVOID lpParam){
HWND m_HWND=CreateWindowEx(dwExStyle、lpClassName、lpWindowName、dwStyle、x、y、nWidth、nHeight、hWndParent、hMenu、hInstance、lpParam);
wndProc=(wndProc)GetWindowLongPtr(m_hWnd,GWL_wndProc);
SetWindowLongPtr(m_hWnd,GWL_WNDPROC,(LONG_PTR)HookedMessageDispatcher);
返回m_hWnd;
}
/*_cdecl*/void\u stdcall HookedPushLetter(内部字母){
如果(!isOnline()){
信件;
返回;
}
如果(字母=='A'|字母=='A'){
返回;
}
如果(字母=='W'| |字母=='W'){
返回;
}
如果(字母=='S'| |字母=='S'){
返回;
}
如果(字母='D'|字母='D'){
返回;
}
信件;
}
无效挂接呼叫(DWORD DWCALLADDESS,DWORD DWNEWADDESS){
DWORD dwOldProtect、dwNewProtect、dwNewCall;
字节调用[4];
dwNewCall=dwNewAddress-dwCallAddress-5;
*(DWORD*)call=dwNewCall;
VirtualProtect((LPVOID)(dwCallAddress+1)、第4页、执行页、写复制页和dwOldProtect);
dwCallAddress+=1;
*(DWORD*)dwCallAddress=*(DWORD*)和call;
虚拟保护((LPVOID)(dwCallAddress)、5、dwOldProtect和dwNewProtect);
}
静态int InitMain(){
char systemDirectory[MAX_PATH];
GetSystemDirectory(系统目录,最大路径);
lstrcat(系统目录“\\ddraw.dll”);
origLibrary=LoadLibrary(系统目录);
如果(!origLibrary){
出口(-1);
}
PushLetter=(_PushLetter)0x458200;
钩叫(0x4CFB8A,(DWORD)和钩叫字母);
DWORD dwOldProtect、dwNewProtect、funcAddress、origAddress;
funcAddress=(DWORD)和HookedCreateWindowEx;
OrigadAddress=(DWORD)((int*)0x5B8574);
VirtualProtect((LPVOID)origadAddress,第4页,读写和dwOldProtect);
memcpy((LPVOID)原件和地址,4);
虚拟保护((LPVOID)origAddress,4,dwOldProtect和dwNewProtect);
返回1;
}
外部“C”{
__declspec(dllexport)HRESULT WINAPI DirectDrawCreate(void*lpGUID,void*lplp,void*pUnkOuter){
FARPROC proc=GetProcAddress(原始库,“DirectDrawCreate”);
如果(!proc)
返回E_INVALIDARG;
返回((HRESULT(WINAPI*)(void*,void*,void*))(DWORD)(proc))(lpGUID,lplp,pUnkOuter);
}
BOOL APIENTY DllMain(HMODULE HMODULE、DWORD dwReason、LPVOID LPREFERED){
开关(原因){
案例DLL\u进程\u附加:
返回InitMain();
案例DLL\u线程\u连接:
案例DLL\u线程\u分离:
案例DLL\u进程\u分离:
打破
}
返回1;
}
}
我会等的,先谢谢你


不幸的是,我没有接通,有人吗?我相信对于那些理解这个主题的人来说,他们知道如何解决这个问题