2010-01-21 9 views
5

का उपयोग कर विंडोज़ की एक सूची प्राप्त करना मैं किसी दिए गए एप्लिकेशन (बाहरी) के लिए सभी विंडो की सूची प्राप्त करने के लिए एक्सेसिबिलिटी एपीआई का उपयोग करना चाहता हूं।मैक/कोको - एक्सेसिबिलिटी एपीआई

लक्ष्य यह जांचना है कि कोई निश्चित विंडो खुली है या नहीं। सबसे पहले मैं जांचता हूं कि एप्लिकेशन चल रहा है ([NSWorkspace runningApplications] का उपयोग करके और प्रत्येक को जांच रहा है), और फिर मैं उस एप्लिकेशन के लिए खुली प्रत्येक विंडो का शीर्षक बार टेक्स्ट देखना चाहता हूं।

पुनश्च

तो मैं पीआईडी ​​का उपयोग करके एप्लिकेशन एक तत्व बना सकते हैं:

AXUIElementRef app = AXUIElementCreateApplication(pid); 

लेकिन मैं इसके साथ क्या करते हैं? क्या मैं भी सही दिशा में जा रहा हूं? इस पर उदाहरण खोजने के लिए बहुत मुश्किल नहीं हो सकता है।

उत्तर

3

उपयोग AXUIElementCopyAttributeValueskAXWindowsAttribute के लिए मान की प्रतिलिपि करने के लिए है, जो AXUIElement वस्तुओं आवेदन की खिड़कियों का प्रतिनिधित्व करने की एक सरणी होना चाहिए।

जैसा कि आप अपने फ़ंक्शन नाम से अनुमान लगा सकते हैं, यह the copy rule का पालन करता है।

+0

नाइस हिंट, पीटर। लेकिन ... यह मेरे लिए काम नहीं करता था और मुझे अंत में पता चला कि 'AXUIElementCopyAttributeNames' प्राप्त करने का प्रयास करते समय मुझे हमेशा 'kAXErrorCannotComplete' था) (मुझे मूल प्रश्न पर' AXUIElementRef' मिल रहा है, क्या यह समस्या होगी ?!)। –

+0

@StuFFmc: मैं सुझाव देता हूं कि एक अलग प्रश्न पूछें और/या एक बग दर्ज करें। –

2

आप windowNumbersWithOptions: का उपयोग कर सकते हैं। यह सभी अनुप्रयोगों से सभी खिड़कियों को उनकी संख्या से सूचीबद्ध करता है। लेकिन मुझे नहीं पता कि एक विंडो नंबर से NSWindow कैसे प्राप्त करें ...

+5

आप सिद्धांत रूप में भी नहीं, एक विंडो नंबर से एनएसविंडो प्राप्त कर सकते हैं, क्योंकि आधार यह है कि आप इसे बाहरी एप्लिकेशन से कर रहे हैं, यानी एक और प्रक्रिया, और प्रत्येक एनएसविंडो * पॉइंटर पता स्थान में है खिड़की का मालिक है। खिड़की संख्या वह सूचकांक है जो विंडो सर्वर का उपयोग करता है और प्रदान करता है ताकि कोई भी एप्लिकेशन अनुरोध स्क्रीन स्नैपशॉट जैसी चीजें कर सके। –

9

मुझे एक्सेसिबिलिटी एपीआई से विंडो आईडी और पीआईडी ​​प्राप्त करने का कोई तरीका नहीं पता।
एनएसविंडो विधि लॉरेंट का उल्लेख केवल विंडो आईडी प्रदान करता है लेकिन खिड़की के मालिक के आवेदन के पीआईडी ​​नहीं।
मैं CGWindowList विधियों का उपयोग करूंगा जो 10.5 के बाद उपलब्ध हैं।
और खिड़की आईडी की सूची मालिक आप निम्नलिखित कोशिश कर सकते हैं की पीआईडी ​​पाने के लिए:

CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID); 
for (NSMutableDictionary* entry in (NSArray*)windowList) 
{ 
    NSString* ownerName = [entry objectForKey:(id)kCGWindowOwnerName]; 
    NSInteger ownerPID = [[entry objectForKey:(id)kCGWindowOwnerPID] integerValue]; 
    NSLog(@"%@:%d", ownerName, ownerPID); 
} 
CFRelease(windowList); 

आप विकल्प पैरामीटर के साथ (गुप्त सहित, ...) सभी खिड़कियां चाहते हैं तो आप नियंत्रित कर सकते हैं।
इसके अलावा प्रवेश वस्तुओं में बहुत अधिक जानकारी होती है। Documentation link

+0

क्या यह स्विफ्ट में भी काम करता है? लगता है कि स्विफ्ट में 'केसीजीएनयूएल विन्डोविइड' के बराबर नहीं है ... – Blaszard

+0

@ ब्लास्ज़ार्ड निरंतर इसके मूल रूप में स्थिर है - 'केसीजी नूलविंडोइड' –

संबंधित मुद्दे