微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

可可-CGEventPost鼠标单击后,屏幕不刷新

如何解决可可-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 举报,一经查实,本站将立刻删除。