2011-07-01 14 views
10

Tôi cần trợ giúp để tìm hiểu cách ứng dụng Từ điển hiển thị hộp thoại bật lên sau cho văn bản đã chọn khi nhấn CMD + CTRL + D trên bất kỳ ứng dụng nào. Tôi muốn triển khai cùng một loại chức năng cho ứng dụng ca cao của mình, nơi ứng dụng của tôi sẽ chạy ẩn và hiển thị các đề xuất về một số nhấn phím nóng cho văn bản đã chọn.Cách nhận tọa độ màn hình toàn cục của văn bản hiện được chọn qua API trợ năng.

Dictionary app hot key suggestion dialog

tôi đã thực hiện nóng chụp chìa khóa, tôi chỉ cần có mã để có được diện tích hình chữ nhật của văn bản được lựa chọn trên màn hình, vì vậy tôi có thể hiển thị hộp thoại như ứng dụng từ điển.

Cảm ơn

+0

làm cách nào bạn hiển thị cửa sổ bật lên vượt quá giới hạn của ứng dụng của riêng bạn? –

Trả lời

14

Bạn có thể sử dụng API trợ năng cho điều đó. Đảm bảo rằng cài đặt "Bật truy cập cho thiết bị trợ giúp" được chọn (trong System Preferences/Universal Access).

Đoạn mã sau sẽ xác định các giới hạn (trong tọa độ màn hình) của văn bản đã chọn trong hầu hết các ứng dụng. Thật không may, nó không hoạt động trong Mail và Safari, vì chúng sử dụng các thuộc tính trợ năng riêng. Nó có thể làm cho nó hoạt động ở đó, nhưng nó đòi hỏi nhiều công việc hơn và có thể là các cuộc gọi API riêng tư.

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); 
+0

Xin chào, cảm ơn mã của bạn. Tôi đã kiểm tra mã của bạn và dường như đang hoạt động và tôi có thể chọn vùng chọn trong TextEdit, nhưng vấn đề là khi tôi cố gắng hiển thị hộp thoại bật lên trên trực tuyến cụ thể đó, thì cửa sổ bật lên hiển thị sai. Về cơ bản, vị trí x của nó hoạt động tốt, nhưng không phải là vị trí y. Vui lòng cho tôi biết, tôi có cần thực hiện một số chuyển đổi để có được vị trí x và y chính xác liên quan đến màn hình hay không. – AmitSri

+0

Các tọa độ được lật theo chiều dọc. Để có một khung cho bảng điều khiển của bạn, bạn sẽ phải chuyển đổi tọa độ y như sau: 'selectionBounds.origin.y = [[NSScreen mainScreen] frame] .size.height - selectionBounds.origin.y - selectionBounds.size. height' (đơn giản hóa một chút, giả định rằng bạn chỉ có một màn hình). – omz

+0

Hoàn hảo. Cảm ơn một lần nữa vì đã giúp tôi. Tôi tự hỏi nếu tôi có thể sử dụng cùng một mã để có được vị trí điểm chèn, giống như việc lựa chọn rect. – AmitSri

0

Những gì bạn đang muốn tìm một Dịch vụ . Với các dịch vụ, ứng dụng của bạn thậm chí không phải chạy hoặc chụp các phím nóng toàn cầu.

Ví dụ: chức năng của ứng dụng từ điển bạn mô tả thực sự là dịch vụ, có thể quan sát được trong menu Dịch vụ.

Dictionary Service Menu

Apple Service Implementation Guide có lẽ là thông tin tốt nhất về các dịch vụ trên mạng.

+0

Cảm ơn câu trả lời của bạn. Tôi biết về các dịch vụ và đã được sử dụng trong ứng dụng của tôi để lấy lựa chọn văn bản. Nhưng yêu cầu là hiển thị hộp thoại bật lên như ứng dụng từ điển trên đã chọn/được đánh dấu trên màn hình, giống như ứng dụng từ điển đang hiển thị trong bài đăng của tôi. Xin vui lòng cho tôi biết tôi đã nhận được khu vực lựa chọn liên quan đến màn hình trong đại biểu dịch vụ? Cảm ơn – AmitSri