2010-01-22 12 views
5

का उपयोग करके सामने की सबसे अधिक विंडो सेट करना मैं बाहरी ऐप (उदाहरण के लिए टेक्स्टडिट) से एक निश्चित विंडो सेट करना चाहता हूं, जो सबसे अधिक है।अभिगम्यता API

मैं GetFrontProcess का उपयोग करके ऐप का सफलतापूर्वक संदर्भ प्राप्त कर सकता हूं, और जांच सकता हूं कि यह सबसे अधिक है या नहीं। यदि ऐसा नहीं है, तो मैं इसे फोकस करने के लिए setFrontProcess का उपयोग कर सकता हूं।

मैं उस एप्लिकेशन के तहत सभी विंडो की जांच करने के लिए एक्सेसिबिलिटी एपीआई का उपयोग कर सकता हूं। मैं जाँच कर रहा हूँ कि एक निश्चित खिड़की मौजूद है, और यदि ऐसा है तो मैं सामने के खिलाफ आवेदन के सबसे खिड़की तुलना:

//get the front window of textEditApp and store it in 'currentFrontWindow' 
    AXUIElementCopyAttributeValue(textEditApp, kAXFocusedWindowAttribute, (CFTypeRef *)&currentFrontWindow); 

खिड़की मैं में दिलचस्पी है frontmost नहीं है, तो मैं इसे इतना सेट करना होगा। मैंने सोचा कि मैं AXUIElement का उपयोग कर सकता हूं विशेषताएँ ऐसा करने के लिए वैल्यू लेकिन मुझे कोई सफलता नहीं मिल रही है। नीचे यह है कि मैंने इसे करने की कोशिश की है।

//set the front window of textEditApp to be desiredFrontWindow 
AXUIElementSetAttributeValue(textEditApp, kAXFocusedUIElementAttribute, desiredFrontWindow); 

मैंने जांच की है कि विंडो मौजूद है, और एप्लिकेशन सफलतापूर्वक 'स्विच' है। लेकिन कोड की यह रेखा निर्दिष्ट विंडो को सामने क्यों नहीं लाती है?

धन्यवाद।

उत्तर

8

लेकिन कोड की यह पंक्ति निर्दिष्ट विंडो को सामने क्यों नहीं लाती है?

क्योंकि आपने केवल-पढ़ने योग्य विशेषता सेट करने का प्रयास किया है।

खिड़की के सामने सबसे आगे बनाने के लिए, आपको विंडो की उचित संपत्ति सेट करने की आवश्यकता है। एक आवेदन के लिए भी यही है: आवेदन को सबसे आगे बनाने के लिए, आपको आवेदन की उचित संपत्ति निर्धारित करने की आवश्यकता है।

सामने की खिड़की के लिए कोको/मैक ओएस एक्स नाम "मुख्य विंडो" है। (उदाहरण के लिए, NSApplication's और NSWindow's methods उस अवधारणा से संबंधित हैं।) अभिगम्यता एक ही नाम का उपयोग करती है, इसलिए एक खिड़की को सबसे आगे बनाने के लिए, kAXMainAttribute का मान kCFBooleanTrue पर सेट करें।

एप्लिकेशन को सबसे आगे बनाने का तरीका समान है: kAXFrontmostAttribute से kCFBooleanTrue का मान सेट करें। आपको इन दोनों को एप्लिकेशन की अगली विंडो सेट करने और एप्लिकेशन को सक्रिय करने की आवश्यकता होगी।

जहां तक ​​मैं कह सकता हूं, एप्लिकेशन के केवल एक खिड़की को सामने लाने और इसे सत्र फोकस देने का कोई तरीका नहीं है।

+0

धन्यवाद (एक बार फिर) पीटर - यह एक आकर्षण काम करता है। एप्लिकेशन के लिए, मैं kAXFrontMostAttribute की बजाय setFrontProcess का उपयोग कर रहा हूं - क्या यह एक बुरा विचार है? एप्लिकेशन और विंडो के माध्यम से अपना रास्ता घुमाने के बाद, एक निश्चित AXUIElementRef है जो मुझे सामने लाने में दिलचस्पी है (यानी इसे कीबोर्ड फोकस देना)। मैं इसका संदर्भ पाने के लिए तत्वों की परतों के माध्यम से दफन कर सकता हूं, लेकिन मैं इसे ध्यान में कैसे सेट करूं? तत्वों के लिए kAXMainAttribute के बराबर है? शायद मुझे पोस्ट करना चाहिए (अभी तक) एक और प्रश्न –

1

मैं हाल ही में पता चला कि, अगर आप कुछ कार्बन कोई आपत्ति नहीं है, तो आप उपयोग कर सकते हैं SetFrontProcessWithOptions सामने के लिए एक खिड़की लाने के लिए और यह ध्यान केंद्रित करता है, तो आप दूसरा तर्क के रूप में kSetFrontProcessFrontWindowOnly पारित देने के लिए।

2

मैं एप्लिकेशन को सामने लाने के लिए एक ऐप I worked on में इसे पूरा करने में सक्षम था, फिर सामने एक खिड़की ला रहा था।

सबसे पहले सामने करने के लिए एप्लिकेशन लाने:

let currentPid = NSRunningApplication.currentApplication().processIdentifier 
if let pid = (the pid of the app in question) where pid != currentPid { 
    NSRunningApplication(processIdentifier: pid)?.activateWithOptions(.ActivateIgnoringOtherApps) 
} 

तब सामने खिड़की भेजने:

let window = (window AXUIElement) 
AXUIElementSetAttributeValue(window, NSAccessibilityMainAttribute, true) 
+1

मेरे लिए काम करता है। धन्यवाद। –