Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 如何将NSString发送到另一个应用程序当前关注的UIElement?_Cocoa_Accessibility_Uielement - Fatal编程技术网

Cocoa 如何将NSString发送到另一个应用程序当前关注的UIElement?

Cocoa 如何将NSString发送到另一个应用程序当前关注的UIElement?,cocoa,accessibility,uielement,Cocoa,Accessibility,Uielement,我有一个菜单栏应用程序,没有停靠图标或全局菜单,它只是一个状态项和一个窗口 我已经把它连接到一个热键上,这个热键可以激活窗口,在关闭窗口后,我可以将焦点发送回以前激活的应用程序 如何将NSString发送到其他应用程序中的活动文本区域,就像用户直接键入一样 我想也许可以使用。如果可能的话,我希望避免使用AppleScript。从中,您需要做两件事: 是的 是的 现在,简单的方法是只获取这两个属性,但这实际上是错误的解决方案 问题是value属性的值是一个普通字符串。如果元素是富格文本视图,您

我有一个菜单栏应用程序,没有停靠图标或全局菜单,它只是一个状态项和一个窗口

我已经把它连接到一个热键上,这个热键可以激活窗口,在关闭窗口后,我可以将焦点发送回以前激活的应用程序

如何将NSString发送到其他应用程序中的活动文本区域,就像用户直接键入一样

我想也许可以使用。如果可能的话,我希望避免使用AppleScript。

从中,您需要做两件事:

  • 是的
  • 是的
现在,简单的方法是只获取这两个属性,但这实际上是错误的解决方案

问题是value属性的值是一个普通字符串。如果元素是富格文本视图,您将丢失用户可能拥有的任何格式或嵌入对象。那太糟糕了

因此,获取值的正确方法是获取元素的,构造一个从零开始的范围,以该数字作为其长度,然后是。如果失败,则得到普通值

一旦同时具有值(属性字符串或普通字符串)和选定范围。如果用户未选择任何内容,则插入点位置处的范围将为空范围(长度为零),并且替换将实际上为插入


然后,将元素的值设置为修改后的字符串。(我只希望将其设置为属性字符串会起作用。)

我最终使用粘贴板和
CGEventCreateKeyboardEvent()
模拟粘贴的
[cmd+v]
键盘快捷键

在激活我的窗口之前,我会录制上一个应用程序:

_previousApplication = [[notification userInfo] objectForKey:NSWorkspaceApplicationKey];
[_previousApplication activateWithOptions:NSApplicationActivateIgnoringOtherApps];
关闭窗口后,我激活上一个应用程序:

_previousApplication = [[notification userInfo] objectForKey:NSWorkspaceApplicationKey];
[_previousApplication activateWithOptions:NSApplicationActivateIgnoringOtherApps];
然后粘贴NSString:

#define KEY_CODE_v ((CGKeyCode)9)

void DCPostCommandAndKey(CGKeyCode key) {
    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);

    CGEventRef keyDown = CGEventCreateKeyboardEvent(source, key, TRUE);
    CGEventSetFlags(keyDown, kCGEventFlagMaskCommand);
    CGEventRef keyUp = CGEventCreateKeyboardEvent(source, key, FALSE);

    CGEventPost(kCGAnnotatedSessionEventTap, keyDown);
    CGEventPost(kCGAnnotatedSessionEventTap, keyUp);

    CFRelease(keyUp);
    CFRelease(keyDown);
    CFRelease(source);
}

DCPostCommandAndKey(KEY_CODE_v);