目标
实现mac的反向控制。
实现方式
通过Qt调用mac api的方式。。
步骤
1,控制端的鼠标键盘消息全部映射成Qt的键盘鼠标值,也就是消息传输的是Qt的值。(这一步其实不用做什么,直接获取就是了)
2,将Qt的值再转换成当前系统所对应的值。
关键代码
键盘的操作
CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStatePrivate);
CGEventRef A = CGEventCreateKeyboardEvent(source, kVK_ANSI_A, true);
CGEventSetFlags(A, kCGEventFlagMaskCommand);//这里按下了command键
CGEventTapLocation location = kCGHIDEventTap;
//发送事件
CGEventPost(location, A);
CFRelease(A);
CFRelease(source);
参考:
macOS上模拟发送键盘事件
Mac OS objectc关于代码模拟键盘输入
建议:因为输入一个字母是两个动作,按下和抬起。因此建议,在收到按下信号的时候,把抬起动作也一起做了。
鼠标的操作
- (void)buttonClick
{
CGPoint pt = CGPointMake(216, 80);
PostMouseEvent(kCGMouseButtonLeft, kCGEventLeftMouseDown, pt);
PostMouseEvent(kCGMouseButtonLeft, kCGEventLeftMouseUp, pt);
sleep(2);
[self writeString:@"Hello" withFlags:0];
}
void PostMouseEvent(CGMouseButton button, CGEventType type, const CGPoint point)
{
CGEventRef theEvent = CGEventCreateMouseEvent(NULL, type, point, button);
CGEventSetType(theEvent, type);
CGEventPost(kCGHIDEventTap, theEvent);
CFRelease(theEvent);
}
双击
Performing a double click using CGEventCreateMouseEvent()
参考
Mac下的按键精灵实现
出现的问题
鼠标右击事件的时候,主程序卡死。然后按一下鼠标就好了。我怀疑是事件循环导致的问题。这里貌似处理了这种情况。
还有就是我用xcode创建了一个macDemo,鼠标的事件没有执行。我怀疑也是这里的问题。