我有一个更大的项目,我希望它具有如果运行的功能,在当前光标位置尽可能快地点击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);
}
我阅读并试过但没有帮助:
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)
答案 0 :(得分:0)
我自己找到了解决方案,这很简单:
首先,我忘了usleep是微秒而不是毫秒。
此外,显然macOS缓冲了原生环境中的点击或键盘输入,但OpenGL并没有。所以当然,如果你在点击/键盘按下之间暂停1秒,它会起作用,但在OpenGL中,如果它们太快,它就会丢弃它们。解决方案是在点击或按键之间等待少量。对我来说工作100毫秒,这意味着在按下之前和之后睡着了(100000)。