【问题标题】:Simulate Click and Drag in OS X在 OS X 中模拟单击和拖动
【发布时间】:2016-02-27 23:12:46
【问题描述】:

我正在尝试通过编程来模拟鼠标动作。

我无法可靠地执行点击和拖动操作

对于单击和拖动,我按照下面提到的顺序执行以下操作

  1. 在当前鼠标指针位置发布鼠标左键按下事件(仅一次)
  2. 移动鼠标(因为鼠标按下事件已经发送,它必须充当鼠标按下并拖动,从初始鼠标位置选择文本)
  3. 发布鼠标左键释放事件以结束鼠标按住操作。

在 Xcode 或 Safari 等苹果应用程序中,此方法不能可靠地工作(它会在拖动时突出显示文本,但使用实际鼠标我可以通过单击和拖动来突出显示文本)。也不能拖动图标。

但是在 Firefox 中,这种技术是有效的。选择跟随鼠标!那就是当我们移动鼠标指针时,选择也会相应地改变,这就是我所需要的。

以下是我用来发送鼠标点击事件的代码。

-(void)_sendMouseEvent:(int)mouseEvent withMouseButton:(CGMouseButton)mouseBtn
{
    CGEventRef ourEvent = CGEventCreate(NULL);
    NSPoint mouseLoc  = CGEventGetLocation(ourEvent); //get current mouse position

    CGEventRef mouseClick = CGEventCreateMouseEvent(
                                                    NULL,
                                                    mouseEvent,
                                                    mouseLoc,
                                                    mouseBtn
                                                    );
    CGEventPost(kCGHIDEventTap, mouseClick);
    CFRelease(ourEvent);
    CFRelease(mouseClick);
}

我确实尝试过定期发送鼠标按下事件,但没有任何改变。

你对我做错了什么有任何想法吗?请提出您想到的任何解决方法。

【问题讨论】:

  • CGPoint mouseLoc = [NSEvent mouseLocation]; 更整洁

标签: objective-c xcode macos mouse hid


【解决方案1】:

我发现我们需要先发送鼠标事件kCGEventLeftMouseDragged,才能开始拖动和选择。

[self _sendMouseEvent:kCGEventLeftMouseDragged withMouseButton:kCGMouseButtonLeft]; //Start draging.

-(void)_sendMouseEvent:(int)mouseEvent withMouseButton:(CGMouseButton)mouseBtn
{
    CGEventRef ourEvent = CGEventCreate(NULL);
    NSPoint mouseLoc  = CGEventGetLocation(ourEvent); //get current mouse position

    CGEventRef mouseClick = CGEventCreateMouseEvent(
                                                    NULL,
                                                    mouseEvent,
                                                    mouseLoc,
                                                    mouseBtn
                                                    );
    CGEventPost(kCGHIDEventTap, mouseClick);
    CFRelease(ourEvent);
    CFRelease(mouseClick);
}

【讨论】:

  • 你是如何实现这一点的,我的意思是你传递给 mouseLoc 的位置是什么?只是当前位置,它不会拖到任何地方
  • 连接了一个真正的鼠标,这段代码唯一做的就是刺激按钮按下,并启动拖动事件kCGEventLeftMouseDragged。因此,在发送拖动和按钮按下事件后,指针被实际鼠标移动。随着鼠标在发送事件后移动,所选对象移动到当前指针位置或选择文本(单击和拖动动作)。一旦拖动结束,按钮释放事件和拖动停止事件就会被发布。
  • 所以我需要发送 >=3 个事件:kCGEventLeftMouseDown (start_x, start_y), n x kCGEventLeftMouseDragged (i
  • 发布每个事件之间的延迟是完成这项工作的关键。根据我的经验,usleep(200000) 在 2018 2.9Ghz 15" rMBP 上运行良好。旧硬件可能需要更长的延迟。
猜你喜欢
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 2011-11-08
  • 2011-03-25
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多