cocoa-单击CGEventPost鼠标后屏幕不刷新
当用户单击某个键盘键(CapsLock)时,我通过编程生成鼠标单击。 当CapsLock打开时,我用鼠标左键按下,然后当CapsLock关闭时,用鼠标左键向上 例如,如果我将鼠标放在窗口标题栏上,单击CapsLock,然后移动鼠标,然后单击CapsLock,则窗口将正确移动。i、 e.我正确地“拖动”窗口,就好像我在移动鼠标时按下了鼠标左键一样 但是有一个问题-当我移动鼠标时窗口不移动,它只在我第二次单击CapsLock后移动到最终位置。i、 e.在我“释放”鼠标按钮后 我需要做什么来确保在鼠标移动期间刷新屏幕 有趣的是,我也迷上了 [N事件添加GlobalMonitorForeventsMatchingMask:NSLeftMouseDraggedMask 发现我的NSLog语句只有在我释放鼠标左键(真正的鼠标左键)后才输出 鼠标点击代码在下面,我可以发布所有的代码,如果需要的话,没有太多cocoa-单击CGEventPost鼠标后屏幕不刷新,cocoa,events,keyboard,mouse,Cocoa,Events,Keyboard,Mouse,当用户单击某个键盘键(CapsLock)时,我通过编程生成鼠标单击。 当CapsLock打开时,我用鼠标左键按下,然后当CapsLock关闭时,用鼠标左键向上 例如,如果我将鼠标放在窗口标题栏上,单击CapsLock,然后移动鼠标,然后单击CapsLock,则窗口将正确移动。i、 e.我正确地“拖动”窗口,就好像我在移动鼠标时按下了鼠标左键一样 但是有一个问题-当我移动鼠标时窗口不移动,它只在我第二次单击CapsLock后移动到最终位置。i、 e.在我“释放”鼠标按钮后 我需要做什么来确保在鼠标
// 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, y = %f", (float)point.x, (float)point.y);
CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);
CGEventRef theEvent = CGEventCreateMouseEvent(source, kCGEventLeftMouseUp, point, kCGMouseButtonLeft);
CGEventSetType(theEvent, kCGEventLeftMouseUp);
CGEventPost(kCGHIDEventTap, theEvent);
CFRelease(theEvent);
如果希望能够拖动窗口,问题是还需要发布
LeftMouseDragged
事件
只需调用beginEventMonitoring
即可开始侦听大写锁定键事件和鼠标移动事件。事件处理程序将根据需要模拟鼠标左键按下和移动。以下是我的博客链接,您可以在这里下载Xcode 4的完整工作示例:
该示例位于公共域中,请随意使用它。:)
根据Apple(),“启用辅助设备访问”需要在“系统首选项”>“通用访问”中进行检查,但我没有检查,这不是问题。只是提醒一下。
请让我知道,如果你有任何进一步的问题,我会尽力帮助
// 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);
}
您是如何为left caps lock key检索密钥事件的?它的事件循环在哪里?没问题,很高兴能提供帮助。:)也为我的示例代码库添加了一点新的内容!