如何解决可可-CGEventPost鼠标单击后,屏幕不刷新
| 当用户单击某个键盘键(CapsLock)时,我以编程方式生成鼠标单击。 因此,当打开CapsLock时,我将鼠标左键按下,然后关闭CapsLock时,将鼠标左键向上拖动。 这样的行为是正确的,例如,如果我将鼠标放在窗口标题栏上,请单击CapsLock,然后移动鼠标,然后单击CapsLock,窗口将正确移动。即,我正确地“拖动”了该窗口,就像在移动鼠标时按住鼠标左键一样。 但是,有一个问题-当我移动鼠标时窗口不会移动,仅当我第二次单击CapsLock后它才会移动到最终位置。即在我“释放”鼠标按钮之后。 我需要做什么以确保在鼠标移动期间刷新屏幕? 有趣的是,我也迷上了 [NSEvent addGlobalMonitorForEventsMatchingMask:NSLeftMouseDraggedMask 并发现我的NSLog语句仅在释放鼠标左键(真正的鼠标左键)后输出 鼠标单击代码在下面,如果需要,我可以发布所有代码,但是代码不多。// simulate mouse down
// get current mouse pos
CGEventRef ourEvent = CGEventCreate(NULL);
CGPoint point = CGEventGetLocation(ourEvent);
NSLog(@\"Location? x= %f,y = %f\",(float)point.x,(float)point.y);
CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);
CGEventRef theEvent = CGEventCreateMouseEvent(source,kCGEventLeftMouseDown,point,kCGMouseButtonLeft);
CGEventSetType(theEvent,kCGEventLeftMouseDown);
CGEventPost(kCGHIDEventTap,theEvent);
CFRelease(theEvent);
// simulate mouse up
// get current mouse pos
CGEventRef ourEvent = CGEventCreate(NULL);
CGPoint point = CGEventGetLocation(ourEvent);
NSLog(@\"Location? x= %f,kCGEventLeftMouseUp,kCGEventLeftMouseUp);
CGEventPost(kCGHIDEventTap,theEvent);
CFRelease(theEvent);
解决方法
如果您希望能够拖动窗口,那么问题在于您还需要发布
LeftMouseDragged
事件。
只需按beginEventMonitoring
开始监听大写锁定键事件和鼠标移动事件。事件处理程序将根据需要模拟鼠标左键的按下和移动。这是我的博客的链接,您可以在其中下载Xcode 4的完整示例:http://www.jakepetroules.com/2011/06/25/simulating-mouse-events-in-cocoa
该示例位于公共领域,您可以根据自己的喜好进行操作。 :)
根据Apple(NSEvent文档)的介绍,需要在“系统偏好设置”>“通用访问”中检查“启用辅助设备的访问权限”才能使它起作用,但是我没有选中它,这不是问题。只是抬头。
如果您有其他任何问题,请告诉我,我们将尽力提供帮助。
// Begin listening for caps lock key presses and mouse movements
- (void)beginEventMonitoring
{
// Determines whether the caps lock key was initially down before we started listening for events
wasCapsLockDown = CGEventSourceKeyState(kCGEventSourceStateHIDSystemState,kVK_CapsLock);
capsLockEventMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSFlagsChangedMask) handler: ^(NSEvent *event)
{
// Determines whether the caps lock key was pressed and posts a mouse down or mouse up event depending on its state
bool isCapsLockDown = [event modifierFlags] & NSAlphaShiftKeyMask;
if (isCapsLockDown && !wasCapsLockDown)
{
[self simulateMouseEvent: kCGEventLeftMouseDown];
wasCapsLockDown = true;
}
else if (wasCapsLockDown)
{
[self simulateMouseEvent: kCGEventLeftMouseUp];
wasCapsLockDown = false;
}
}];
mouseMovementEventMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSMouseMovedMask) handler:^(NSEvent *event)
{
[self simulateMouseEvent: kCGEventLeftMouseDragged];
}];
}
// Cease listening for caps lock key presses and mouse movements
- (void)endEventMonitoring
{
if (capsLockEventMonitor)
{
[NSEvent removeMonitor: capsLockEventMonitor];
capsLockEventMonitor = nil;
}
if (mouseMovementEventMonitor)
{
[NSEvent removeMonitor: mouseMovementEventMonitor];
mouseMovementEventMonitor = nil;
}
}
-(void)simulateMouseEvent:(CGEventType)eventType
{
// Get the current mouse position
CGEventRef ourEvent = CGEventCreate(NULL);
CGPoint mouseLocation = CGEventGetLocation(ourEvent);
// Create and post the event
CGEventRef event = CGEventCreateMouseEvent(CGEventSourceCreate(kCGEventSourceStateHIDSystemState),eventType,mouseLocation,kCGMouseButtonLeft);
CGEventPost(kCGHIDEventTap,event);
CFRelease(event);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。