如何在Cocoa应用程序中模拟鼠标单击?

时间:2018-12-07 07:00:37

标签: objective-c macos cocoa

我需要将鼠标单击发送到我的NSView。文档中介绍了NSEvent +mouseEventWithType:location:modifierFlags:timestamp:windowNumber:context:eventNumber:clickCount:pressure:函数。但我找不到如何确切使用此信息。应该使用timestampeventNumberclickNumber的哪些值?也没有 click 事件的类型。有鼠标按下和鼠标按下事件的类型。我是否一时将它们都发送出去?还是我必须延迟一些时间?目前,我尝试使用此类代码。

// self.label is NSTextField
[self.label setAllowsEditingTextAttributes: YES];
[self.label setSelectable: YES];

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"Google"];
[str addAttribute: NSLinkAttributeName value: @"http://www.google.com" range: NSMakeRange(0, str.length)];
[self.label setAttributedStringValue:str];

NSEvent *mouseEvent;
mouseEvent = [NSEvent mouseEventWithType:NSLeftMouseDown
                                location:NSMakePoint(0., 0.)
                           modifierFlags:0
                               timestamp:0
                            windowNumber:0
                                 context:nil
                             eventNumber:0
                              clickCount:1
                                pressure:1.];
[self.label mouseDown:mouseEvent];

mouseEvent = [NSEvent mouseEventWithType:NSLeftMouseUp
                                location:NSMakePoint(0., 0.)
                           modifierFlags:0
                               timestamp:0
                            windowNumber:0
                                 context:nil
                             eventNumber:0
                              clickCount:1
                                pressure:1.];

[self.label mouseUp:mouseEvent];

似乎有效。但是在单击后,当我将鼠标指针移动到标签时,鼠标指针没有显示为手(打开url)。我的初始问题网址未在NSTextField中显示为网址。它看起来像是常规文本。单击标签上的任意位置(非链接)后,文本将突出显示。因此,我想在显示NSWindow之后以编程方式单击以应用单击变通方法。

P.S。实际上,NSTextField中带有URL的初始问题已解决。我将代码重写为使用NSTextView而不是NSTextField。它完全按预期工作,但需要更多自定义。 IB也自动为NSScrollView创建了NSTextView。无论如何,关于正确创建NSEvent和发送问题仍然存在。

3 个答案:

答案 0 :(得分:0)

要更改鼠标指针,您可以编写一个自定义的文本字段类,并覆盖“ resetCursorRects”

您可以引用链接:Can't change the mouse cursor of a NSTextField

答案 1 :(得分:0)

您无需点击鼠标。使其成为第一响应者就足够了。但这是脆弱的。有关原始问题NSTextField with URL-style format

的话题很多

我遇到了同样的问题,最后,我使用了NSTextView而不是NSTextField。

答案 2 :(得分:0)

我使用以下代码创建一个虚假事件,以弹出一个与我通过Javascript发送的WKWebView位置相关的上下文菜单。无论如何,它也应普遍用于其他目的:

NSPoint clickPoint = NSMakePoint(x, y);
NSEvent * evt = [NSEvent mouseEventWithType:NSEventTypeLeftMouseUp 
                                   location:[view convertPoint:clickPoint toView:nil]
                              modifierFlags:0
                                  timestamp:0
                               windowNumber:view.window.windowNumber 
                                    context:nil
                                eventNumber:0
                                 clickCount:1
                                   pressure:1.];