这段代码存在几个问题:

  1. 在 MoveMouse 函数中,先设置了鼠标数据格式,然后又在 GetDeviceState 中重新设置了一次,这是不必要的。

  2. 在 MoveMouse 函数中,应该先 Acquire 鼠标设备,然后才能获取设备状态,最后再 Unacquire 设备。而现在的代码是在获取设备状态之前 Acquire 设备,这会导致获取失败。

  3. 在 DLL_PROCESS_DETACH 中释放资源时,应该先释放鼠标设备,再释放 DirectInput 对象。因为鼠标设备依赖于 DirectInput 对象,如果先释放 DirectInput 对象,那么鼠标设备就无法使用了。

下面是修改后的代码:

#include "pch.h"

#define DIRECTINPUT_VERSION 0x0800 #include <dinput.h> #pragma comment(lib, "dinput8.lib") #pragma comment(lib, "dxguid.lib")

LPDIRECTINPUT8 g_pDI = NULL; LPDIRECTINPUTDEVICE8 g_pMouse = NULL;

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: // 初始化DirectInput DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&g_pDI, NULL);

    // 创建鼠标设备
    g_pDI->CreateDevice(GUID_SysMouse, &g_pMouse, NULL);

    // 设置鼠标数据格式
    g_pMouse->SetDataFormat(&c_dfDIMouse);

    // 设置鼠标协作级别
    g_pMouse->SetCooperativeLevel(NULL, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE);

    // 设置鼠标缓冲区大小
    DIPROPDWORD dipdw;
    dipdw.diph.dwSize = sizeof(DIPROPDWORD);
    dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
    dipdw.diph.dwObj = 0;
    dipdw.diph.dwHow = DIPH_DEVICE;
    dipdw.dwData = 16;
    g_pMouse->SetProperty(DIPROP_BUFFERSIZE, &dipdw.diph);

    // 启动鼠标设备
    g_pMouse->Acquire();
    break;

case DLL_PROCESS_DETACH:
    // 释放鼠标设备
    if (g_pMouse)
    {
        g_pMouse->Unacquire();
        g_pMouse->Release();
        g_pMouse = NULL;
    }

    // 释放DirectInput
    if (g_pDI)
    {
        g_pDI->Release();
        g_pDI = NULL;
    }
    break;
}

return TRUE;

}

// 模拟鼠标移动 void MoveMouse(int deltaX, int deltaY) { DIMOUSESTATE2 dims; memset(&dims, 0, sizeof(dims));

// 先 Acquire 鼠标设备
g_pMouse->Acquire();

// 获取设备状态
if (SUCCEEDED(g_pMouse->GetDeviceState(sizeof(DIMOUSESTATE2), &dims)))
{
    // 修改鼠标状态
    dims.lX += deltaX;
    dims.lY += deltaY;

    // 设置鼠标状态
    g_pMouse->SetDataFormat(&c_dfDIMouse);
    g_pMouse->SetDeviceState(sizeof(DIMOUSESTATE2), &dims);
}

// 释放鼠标设备
g_pMouse->Unacquire();

}


原文地址: https://www.cveoy.top/t/topic/bG7p 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录