API доступа к MacOS изменяет значение выбранного диапазона - PullRequest
0 голосов
/ 18 мая 2018

Я использую Какао с общедоступной системой API Accessibility, чтобы получить некоторую информацию, такую ​​как текстовое значение, выбранное текстовое значение, но есть ли способ изменить что-либо из этого?Как вы можете видеть на моей картинке, вы можете редактировать расположение курсора клавиатуры (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}

value I want to change

1 Ответ

0 голосов
/ 22 мая 2018

Во-первых, получаемое вами значение не является строковым объектом.Приведение его к 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 */;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...