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
相关产品推荐
相关产品推荐

