Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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
Objective c MacOS辅助功能API更改选定范围位置的值_Objective C_Macos_Cocoa - Fatal编程技术网

Objective c MacOS辅助功能API更改选定范围位置的值

Objective c MacOS辅助功能API更改选定范围位置的值,objective-c,macos,cocoa,Objective C,Macos,Cocoa,我正在使用Cocoa和Accessibility API系统范围内获取一些信息,如文本值、选定文本值,但有没有办法更改这些信息?正如您在我的图片上看到的,您可以编辑键盘光标(Loc)的位置和所选文本的长度(Len),因此必须有一种方法以编程方式完成此操作。此外,我正在寻找如何获得键盘光标位置(闪烁插入符号)在屏幕内,即使没有选择。(我见过应用程序这样做) 编辑: 这是我到目前为止获取属性的代码: AXValueRef textValue = NULL; //Get the location

我正在使用Cocoa和Accessibility API系统范围内获取一些信息,如文本值、选定文本值,但有没有办法更改这些信息?正如您在我的图片上看到的,您可以编辑键盘光标(Loc)的位置和所选文本的长度(Len),因此必须有一种方法以编程方式完成此操作。此外,我正在寻找如何获得键盘光标位置(闪烁插入符号)在屏幕内,即使没有选择。(我见过应用程序这样做)

编辑:

这是我到目前为止获取属性的代码:

 AXValueRef textValue = NULL;
 //Get the location string inside the selectedtextrange
 AXError gettextvalueError = AXUIElementCopyAttributeValue(focussedElement, kAXSelectedTextRangeAttribute , (CFTypeRef *)&textValue);   //get the text value of focussedElement in object textValue

 if(gettextvalueError != kAXErrorSuccess){
     NSLog(@"error");
 }else{
     NSString* textStr = (__bridge NSString*)textValue;      // Convert textValue to NSString
 }
这是给我一个字符串,包含所选文本和位置+长度的边界对象。只能更改位置吗

<AXValue 0x7f8dda3c4340> {value = location:3 length:0 type = kAXValueCFRangeType}

首先,您获得的值不是字符串对象。将其强制转换为
NSString*
不会“转换”它,它只是由编译器决定。记录它工作的原因是,
%@
要求对象提供它的描述,
AXValue
对象按照您在输出中看到的方式描述自己

要解码该值,请使用如下代码:

CFRange range;
if (AXValueGetValue(textValue, kAXValueTypeCFRange, &range))
{
    // use the range
}
else
    /* the value isn't of the type that the attribute is supposed to have; abort */;
如果要更改它,请执行以下操作:

range.location = /* some new value */;
AXValueRef newValue = AXValueCreate(kAXValueTypeCFRange, &range);
if (newValue)
{
    AXError setError = AXUIElementSetAttributeValue(focussedElement, kAXSelectedTextRangeAttribute, newValue);
    /* check setError and handle as appropriate */
    CFRelease(newValue);
}
else
    /* handle failure */;

到目前为止,您的代码是否可能重复?你尝试过什么?如果你能得到一个值,你可以通过使用
AXUIElementSetAttributeValue
而不是
AXUIElementCopyAttributeValue
@Willeke谢谢,但是属性是我的问题,我得到这个:{value=location:3 length:0 type=kAXValueCFRangeType}。我怎样才能只更改位置或长度。这非常有用,非常感谢。我还设法在根本没有被选中的情况下获得所选范围的边界。(如果您希望在不破坏用户体验的情况下获得插入符号位置,这非常有用)。我会用你的答案更新我的问题。@hugo411你是如何在没有选择范围的情况下获得插入符号位置的?我只能获取插入符号位置,除非范围长度和位置为0。有什么建议吗?@hugo411我很好奇你是怎么做到的?我正试着得到插入符号的位置,来展示一件府绸。