2014-09-11 48 views
0

我試圖讓系統所選文本的範圍,我發現這個方法在這裏:爲什麼不從其他類或子類工作?

+ (void) getPosition{ 
    AXUIElementRef systemWideElement = AXUIElementCreateSystemWide(); 
    AXUIElementRef focussedElement = NULL; 
    AXError error = AXUIElementCopyAttributeValue(systemWideElement, kAXFocusedUIElementAttribute, (CFTypeRef *)&focussedElement); 

    if (error != kAXErrorSuccess) { 
     NSLog(@"Could not get focussed element"); 
    } else { 
     AXValueRef selectedRangeValue = NULL; 
     AXError getSelectedRangeError = AXUIElementCopyAttributeValue(focussedElement, kAXSelectedTextRangeAttribute, (CFTypeRef *)&selectedRangeValue); 
     if (getSelectedRangeError == kAXErrorSuccess) { 
      CFRange selectedRange; 
      AXValueGetValue(selectedRangeValue, kAXValueCFRangeType, &selectedRange); 
      AXValueRef selectionBoundsValue = NULL; 
      AXError getSelectionBoundsError = AXUIElementCopyParameterizedAttributeValue(focussedElement, kAXBoundsForRangeParameterizedAttribute, selectedRangeValue, (CFTypeRef *)&selectionBoundsValue); 
      CFRelease(selectedRangeValue); 
      if (getSelectionBoundsError == kAXErrorSuccess) { 
       CGRect selectionBounds; 
       AXValueGetValue(selectionBoundsValue, kAXValueCGRectType, &selectionBounds); 
       NSLog(@"Selection bounds: %@", NSStringFromRect(NSRectFromCGRect(selectionBounds))); 
      } else { 
       NSLog(@"Could not get bounds for selected range"); 
      } 
      if (selectionBoundsValue != NULL) CFRelease(selectionBoundsValue); 
     } else { 
      NSLog(@"Could not get selected range"); 
     } 
    } 
    if (focussedElement != NULL) CFRelease(focussedElement); 
    CFRelease(systemWideElement); 
} 

但是,如果我從別的比appDelegate.m級呼叫如果它總是返回:

Could not get focussed element 

我錯過了什麼設置?

或者是否有其他人知道如何讓系統選定文本位置?

+0

我試了你的答案,沒有運氣,我想檢查錯誤類型,但它重新運行一個負數,如-2356例如 – 2014-09-11 17:40:31

+0

比我試圖檢查其他變量有什麼,但他們都是空的,沒有任何信息,如果我檢查這裏的任何變量:AXUIElementRef systemWideElement = AXUIElementCreateSystemWide(); AXUIElementRef focussedElement = NULL; AXError error = AXUIElementCopyAttributeValue(systemWideElement,kAXFocusedUIElementAttribute,(CFTypeRef *)&focussedElement); – 2014-09-11 17:41:19

回答

1

您不應將focussedvalue(實際拼寫focusedvalue)初始化爲AXUIElementRef,然後在將其作爲參數傳遞給AXUIElementCopyAttributeValue時對其進行類型轉換。
而是將其初始化爲CFTypeRef

嘗試了這一點,看看示例代碼在這裏以供參考: https://developer.apple.com/library/mac/samplecode/UIElementInspector/Listings/UIElementUtilities_m.html#//apple_ref/doc/uid/DTS10000728-UIElementUtilities_m-DontLinkElementID_14

+0

Thx for the Answer,但我是一個初學者,它對我來說很難遵循你的步驟,即使「初始化first2是一本有七個密碼的書給我^^,你能給我一個小提示或例子,在哪裏以及如何初始化? – 2014-09-11 15:02:27

+0

我忽略了我的代碼,對不起,不能遵循你的建議,對我來說,代碼早於任何focusdValue得到初始化時間脫離... – 2014-09-11 15:07:44

+0

沒關係!我是一個初學者自己:) 'AXUIElementRef focussedElement =空值;'是你初始化變量的地方,它應該是'CFTypeRef'類型' 如果你得到'不能聚焦的元素',那麼這意味着你沒有更早打破,並且你正在完成到你發現錯誤的地步 – 2014-09-11 15:46:49

0

所以,我找到了一種方法來定位從我的應用程序Delegate.m文件的窗口,所以我的想法是,如果我不能得到界限進入我的自定義類,我從他們的AppDelegate.m文件中取出它們,並將窗口放在那裏,好,好,但是,無論我做什麼,我都收到了不能選擇範圍的錯誤消息,代碼是一次再次-25212,這整個東西很爛...

我不得不處理可可的最奇怪的零件之一...

相關問題