You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Logitech G-key C DLL初始化成功但Python回调未触发问题排查

Logitech G-key SDK Python接口回调未触发问题

我拥有Logitech G-key的C DLL库,尝试为其编写Python接口。SDK初始化成功,但按下任意G键时回调函数从未执行。

C头文件定义

typedef struct
{
    unsigned int keyIdx         : 8;        // G键或鼠标按钮的索引,例如G6或按钮6对应6
    unsigned int keyDown        : 1;        // 按键按下/抬起状态,1为按下,0为抬起
    unsigned int mState         : 2;        // M状态(1、2、3对应M1、M2、M3)
    unsigned int mouse          : 1;        // 事件是否来自鼠标,1是,0否
    unsigned int reserved1      : 4;        // 保留字段1
    unsigned int reserved2      : 16;       // 保留字段2
} GkeyCode;

// 用于响应G键事件的回调,在其他线程上下文执行
typedef void (__cdecl *logiGkeyCB)(GkeyCode gkeyCode, const wchar_t* gkeyOrButtonString, void* context);

typedef struct
{
    logiGkeyCB gkeyCallBack;
    void* gkeyContext;
} logiGkeyCBContext;

// 调用此函数启用Gkey SDK
BOOL LogiGkeyInit(logiGkeyCBContext* gkeyCBContext);

// 不使用回调时调用此函数初始化SDK(适用于Unreal Engine)
BOOL LogiGkeyInitWithoutCallback();

// 不使用上下文时调用此函数初始化SDK(适用于Unity Engine)
BOOL LogiGkeyInitWithoutContext(logiGkeyCB gkeyCallBack);

// 检查鼠标按钮是否当前按下
BOOL LogiGkeyIsMouseButtonPressed(const int buttonNumber);

// 获取鼠标按钮的友好名称
wchar_t* LogiGkeyGetMouseButtonString(const int buttonNumber);

// 检查键盘G键是否当前按下
BOOL LogiGkeyIsKeyboardGkeyPressed(const int gkeyNumber,const  int modeNumber);

// 获取G键的友好名称
wchar_t* LogiGkeyGetKeyboardGkeyString(const int gkeyNumber,const  int modeNumber);

// 禁用Gkey SDK,释放所有资源
void LogiGkeyShutdown();

我编写的Python代码

import ctypes
import time

# 定义GkeyCode结构体
class GkeyCode(ctypes.Structure):
    _fields_ = [
        ("keyIdx", ctypes.c_uint, 8),
        ("keyDown", ctypes.c_uint, 1),
        ("mState", ctypes.c_uint, 2),
        ("mouse", ctypes.c_uint, 1),
        ("reserved1", ctypes.c_uint, 4),
        ("reserved2", ctypes.c_uint, 16)
    ]

# 定义logiGkeyCBContext结构体
class logiGkeyCBContext(ctypes.Structure):
    _fields_ = [
        ("gkeyCallBack", ctypes.CFUNCTYPE(None, GkeyCode, ctypes.c_wchar_p, ctypes.c_void_p)),
        ("gkeyContext", ctypes.c_void_p)
    ]

# 加载Logitech Gaming G-key SDK动态库
dll_path = "C:\\Program Files\\Logitech Gaming Software\\GkeySDK_8.57.148\\Lib\\GameEnginesWrapper\\x64\\LogitechGkeyEnginesWrapper.dll"
gkey_lib = ctypes.CDLL(dll_path)

# 定义回调函数
def gkey_callback(gkeyCode, gkeyOrButtonString, context):
    print(f"Received G-key or button event: keyIdx={gkeyCode.keyIdx}, keyDown={gkeyCode.keyDown}, mState={gkeyCode.mState}, mouse={gkeyCode.mouse}")
    print(f"G-key or button string: {gkeyOrButtonString}")
    print(f"Context: {context}")

# 创建logiGkeyCBContext实例
context = logiGkeyCBContext()
callback_func_type = ctypes.CFUNCTYPE(None, GkeyCode, ctypes.c_wchar_p, ctypes.c_void_p)
callback_func = callback_func_type(gkey_callback)
context.gkeyCallBack = callback_func
context.gkeyContext = ctypes.c_void_p(0)  # 设置合适的上下文

# 初始化Logitech Gaming G-key SDK
gkey_lib.LogiGkeyInit.restype = ctypes.c_bool
gkey_lib.LogiGkeyInit.argtypes = (ctypes.POINTER(logiGkeyCBContext),)

success = gkey_lib.LogiGkeyInit(ctypes.byref(context))
if success:
    print("Logitech Gaming G-key SDK initialized successfully.")
else:
    print("Failed to initialize Logitech Gaming G-key SDK.")

c = 0
while c < 100:
    c += 1
    time.sleep(0.1)

# 关闭G-key SDK
gkey_lib.LogiGkeyShutdown()

可用的C示例代码

轮询示例

#include <stdio.h>
#include <windows.h>
#include <LogitechGkeyLib.h>

int main() {
    LogiGkeyInit(NULL);
    printf("Press G-keys. Press Ctrl+C to exit.\n");
    while (true) {
        for (int index = 1; index <= LOGITECH_MAX_GKEYS; index++) {
            for (int mKeyIndex = 1; mKeyIndex <= LOGITECH_MAX_M_STATES; mKeyIndex++) {
                if (LogiGkeyIsKeyboardGkeyPressed(index, mKeyIndex))
                    wprintf(L"Button: %s\n", LogiGkeyGetKeyboardGkeyString(index, mKeyIndex));
            }
        }
        Sleep(100);
    }
    LogiGkeyShutdown();
    return 0;
}

回调示例

#include <stdio.h>
#include <windows.h>
#include <LogitechGkeyLib.h>
#include <iostream>

void __cdecl GkeySDKCallback(GkeyCode gkeyCode, wchar_t* gkeyOrButtonString, void* /*pContext*/)
{
    std::wcout << L"G-Key pressed: " << gkeyOrButtonString << std::endl;
}

int main()
{
    logiGkeyCBContext gkeyContext;
    ZeroMemory(&gkeyContext, sizeof(gkeyContext));
    gkeyContext.gkeyCallBack = (logiGkeyCB)GkeySDKCallback;
    gkeyContext.gkeyContext = NULL;

    LogiGkeyInit(&gkeyContext);

    std::cout << "Press G-keys. Press Ctrl+C to exit." << std::endl;

    while (true)
    {
        // 保持程序运行以接收G键事件
    }
    LogiGkeyShutdown();

    return 0;
}

我尝试使用ctypes或cffi编写Python调用C函数的代码但未成功,请问问题出在哪里?或能否给我一些解决方向?


内容的提问来源于stack exchange,提问作者emcek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 21:45:03