GLFW环境下模拟鼠标右键点击以触发屏幕刷新的技术咨询
GLFW环境下模拟右键点击实现自动刷新的方案
优先方案:内部状态注入(无平台依赖,无副作用)
GLFW本身没有提供模拟用户输入的官方接口,你不需要真的模拟系统级鼠标操作,只要手动触发你现有代码里的右键状态变更逻辑即可,实现成本最低,也不会误触发系统右键菜单:
情况1:你的状态检测逻辑和示例代码一致,靠全局/类成员变量rbuttonstate做状态差判断
在相机视角更新完成的函数末尾,直接插入以下代码即可:
// 手动构造右键按下状态变更,触发原有按下逻辑 int state = GLFW_PRESS; double mousex, mousey; if (state == GLFW_PRESS && rbuttonstate == GLFW_RELEASE) { glfwGetCursorPos(handle, &mousex, &mousey); oldMousePos = glm::vec2((float)mousex, (float)mousey); } rbuttonstate = state; // 间隔10ms避免状态判定失效,不需要高精度的话也可以不加 std::this_thread::sleep_for(std::chrono::milliseconds(10)); // 手动构造右键释放状态变更 state = GLFW_RELEASE; rbuttonstate = state;
情况2:你的右键逻辑绑定在GLFW的按键回调函数上
直接手动调用回调函数即可,假设你的回调函数名为onMouseButton:
// 触发按下事件 onMouseButton(handle, GLFW_MOUSE_BUTTON_RIGHT, GLFW_PRESS, 0); std::this_thread::sleep_for(std::chrono::milliseconds(10)); // 触发释放事件 onMouseButton(handle, GLFW_MOUSE_BUTTON_RIGHT, GLFW_RELEASE, 0);
备用方案:系统级模拟鼠标点击(仅适用于刷新逻辑在第三方闭源库中,无法修改内部代码的场景)
需要根据运行平台调用对应系统API实现:
Windows平台
#include <Windows.h> // 右键按下 mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0); Sleep(10); // 右键释放 mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
Linux X11环境
#include <X11/Xlib.h> #include <X11/extensions/XTest.h> #include <unistd.h> Display* dpy = XOpenDisplay(NULL); // 右键按下,3对应右键编号 XTestFakeButtonEvent(dpy, 3, True, CurrentTime); XFlush(dpy); usleep(10000); // 右键释放 XTestFakeButtonEvent(dpy, 3, False, CurrentTime); XFlush(dpy); XCloseDisplay(dpy);
macOS平台
#include <ApplicationServices/ApplicationServices.h> #include <unistd.h> CGPoint cursorPos = CGEventGetLocation(CGEventCreate(NULL)); // 右键按下 CGEventRef downEvt = CGEventCreateMouseEvent(NULL, kCGEventRightMouseDown, cursorPos, kCGMouseButtonRight); CGEventPost(kCGHIDEventTap, downEvt); CFRelease(downEvt); usleep(10000); // 右键释放 CGEventRef upEvt = CGEventCreateMouseEvent(NULL, kCGEventRightMouseUp, cursorPos, kCGMouseButtonRight); CGEventPost(kCGHIDEventTap, upEvt); CFRelease(upEvt);
注意:该方案会在系统全局层面触发右键点击,若程序窗口未处于前台会误操作其他应用,非必要不推荐使用。
内容的提问来源于stack exchange,提问作者Megan Darcy
相关产品推荐
相关产品推荐

