在OpenGL中的macOS上忽略模拟鼠标事件

时间:2017-05-18 23:20:57

标签: c macos click mouseevent

我有一个更大的项目,我希望它具有如果运行的功能,在当前光标位置尽可能快地点击10次。

这种工作在我的桌面上,例如我尝试在终端中运行程序并将光标放在菜单栏上。但是,如果我切换到另一个应用程序(我在窗口模式下尝试游戏)(我首先让我的程序睡眠4秒,所以我有足够的时间来切换),它只需点击一次。游戏是一个射击游戏,所以它应该快速射击几次,但它只会发射一次并忽略所有其他事件。

如果我让我的程序在循环之间休眠1秒,它就会起作用。

也许我用CGEvents错了?使用MouseEvents和实际点击之间有区别吗?我的意思是游戏不应该完全相同吗?

这是我的孤立代码:

// Compile with: gcc -o click test.c -Wall -framework ApplicationServices

#include <ApplicationServices/ApplicationServices.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    // To click on current position (seems to work)
    CGEventRef event = CGEventCreate(NULL);
    CGPoint cursor = CGEventGetLocation(event);


    CGEventRef click_down = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, cursor, kCGMouseButtonLeft);

    CGEventRef click_up = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseUp, cursor, kCGMouseButtonLeft);

    // Tried adding usleep between both events but anything under 1s doesnt work
    for(int i = 0; i < 10; i++){
        CGEventPost(kCGSessionEventTap, click_down);
        // usleep(500);
        CGEventPost(kCGSessionEventTap, click_up);
        // usleep(500);
    }

    // Release the events
    CFRelease(event);
    CFRelease(click_down);
    CFRelease(click_up);

}

我阅读并试过但没有帮助:

Simulate mouse on Mac

Simulating mouse clicks on Mac OS X does not work for some applications - &GT;不幸的是没有帮助或解决问题

Synthetic click doesn't switch application's menu bar (Mac OS X)

1 个答案:

答案 0 :(得分:0)

我自己找到了解决方案,这很简单:

首先,我忘了usleep是微秒而不是毫秒。

此外,显然macOS缓冲了原生环境中的点击或键盘输入,但OpenGL并没有。所以当然,如果你在点击/键盘按下之间暂停1秒,它会起作用,但在OpenGL中,如果它们太快,它就会丢弃它们。解决方案是在点击或按键之间等待少量。对我来说工作100毫秒,这意味着在按下之前和之后睡着了(100000)。