【问题标题】:cocoa - screen not refreshing after CGEventPost mouse click可可 - CGEventPost 鼠标点击后屏幕不刷新
【发布时间】:2011-09-13 14:39:14
【问题描述】:

当用户单击某个键盘键 (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, 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);

【问题讨论】:

  • 您如何检索左大写锁定键的键事件?它的事件循环在哪里?

标签: cocoa events keyboard mouse


【解决方案1】:

如果你希望能够拖动窗口,问题是你还需要发布一个LeftMouseDragged事件。

只需调用beginEventMonitoring 即可开始监听大写锁定键事件和鼠标移动事件。事件处理程序将根据您的需要模拟鼠标左键按下和移动。这是我博客的链接,您可以在其中下载 Xcode 4 的完整工作示例:http://www.jakepetroules.com/2011/06/25/simulating-mouse-events-in-cocoa

该示例属于公共领域,您可以随意使用它。 :)

根据 Apple (NSEvent documentation) 的说法,需要在“系统偏好设置”>“通用访问”中选中“启用辅助设备访问”才能使其正常工作,但我没有选中它,这不是问题。只是提醒一下。

如果您有任何其他问题,请告诉我,我会尽力提供帮助。

// 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);
}

【讨论】:

  • 没问题,很高兴能帮上忙。 :) 也向我的示例代码库添加了一点!
猜你喜欢
  • 2021-07-03
  • 1970-01-01
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多