Tôi đang cố vá an application thay đổi kích thước cửa sổ bằng API trợ năng.Nhận dạng duy nhất cửa sổ đang hoạt động trên OS X
Tôi cần duy trì từ điển có kích thước cửa sổ trước đó. Chìa khóa cần xác định cửa sổ hiện đang hoạt động. Tại thời điểm này, cửa sổ hiện hoạt này được truy xuất qua NSAccessibilityFocusedWindowAttribute
khi nhấn phím nóng.
Tuy nhiên, mỗi lần phương thức này được gọi, số trả lại AXUIElementRef
xác định cửa sổ khác nhau! Điều này tất nhiên có nghĩa là tôi không thể sử dụng nó làm khóa từ điển - từ điển sẽ không tìm thấy mục nhập tương ứng.
Các mã sau tái tạo các vấn đề:
-(IBAction)testWindowIdentification:(id)sender{
AXUIElementRef focusedApp;
AXUIElementRef focusedWindow;
AXUIElementCopyAttributeValue(_systemWideElement,
(CFStringRef) kAXFocusedApplicationAttribute,
(CFTypeRef*) &focusedApp);
AXUIElementCopyAttributeValue((AXUIElementRef) focusedApp,
(CFStringRef) NSAccessibilityFocusedWindowAttribute,
(CFTypeRef*) &focusedWindow);
CFShow(focusedWindow);
}
_systemWideElement
đã được khởi tạo trong phương pháp init
sử dụng một cuộc gọi đến AXUIElementCreateSystemWide()
.
Tuyên bố CFShow
rõ ràng hiển thị ID khác nhau mỗi khi phương pháp này được gọi là (mặc dù cùng một cửa sổ đang hoạt động), mà là vô ích cho tôi:
<AXUIElement 0x47e850> {pid=42463}
<AXUIElement 0x47e890> {pid=42463}
<AXUIElement 0x47e2c0> {pid=42463}
…
Các documentation on AXUIElement
cho thấy không có phương pháp để lấy một thuộc tính duy nhất cho phần tử giao diện người dùng và không phải là that of the NSAccessibility
protocol. PID duy nhất là không phải đủ cho tôi, vì quá trình có thể có nhiều cửa sổ.
Làm cách nào tôi có thể truy xuất một số số nhận dạng duy nhất của cửa sổ hiện hoạt trong Cocoa?
(Bằng cách này, các mã thực là kiểm tra mã trở lại trong các cuộc gọi trên, không có lỗi, các cuộc gọi thành công.)
@JeremyBanks Người trả lời ban đầu có ý tưởng đúng ở đây. Bạn thực sự có thể sử dụng Quartz để có được một 'CGWindowID' một khi bạn đã xác định được cửa sổ tập trung, nếu [câu trả lời này] (http://stackoverflow.com/a/312099/517815) là để được tin tưởng. _should_ này cung cấp cho bạn mã định danh cửa sổ duy nhất mà bạn đang hy vọng, mà bạn có thể vượt qua xung quanh với khả năng miễn dịch trong ngữ cảnh của ứng dụng hiện tại của bạn. Hãy cho tôi biết nếu bạn muốn có một phiên bản mạch lạc và đầy đủ hơn về điều này như một câu trả lời thực tế. – MrGomez
@MrGomez Chắc chắn, một câu trả lời như thế sẽ rất tuyệt. :) –
@JeremyBanks Sẽ làm. Hôm nay tôi hơi quá tải, nhưng tôi sẽ cố gắng trả lời câu hỏi này vào tối nay (PST). :) – MrGomez