cocoa - खिड़की सामने लाया गया है यह पता लगाने के लिए मैं कैसे कोको की पहुंच क्षमता एपीआई का उपयोग कर सकता हूं?
accessibility-api (3)
मैं एक विशिष्ट अनुप्रयोग विंडो खोलता है, खिड़कियों को बंद करता है, जब खिड़कियों को स्थानांतरित या पुन: आकारित किया जाता है, या मुख्य और / या फ़ोकस किए जाने पर पता लगाने के लिए पहुंच योग्यता एपीआई का उपयोग कर रहा हूं। हालांकि क्लाइंट ऐप एक ऐक्सेसिबिलिटी एपीआई अधिसूचना के बिना खिड़की को स्थानांतरित करने के लिए लगता है।
जब कोई अन्य एप्लिकेशन एक कुंजी को बिना कुंजी के सामने सामने लाता है, तो मेरा आवेदन कैसे पता लगा सकता है?
मुझे ओएस एक्स 10.4 और 10.5 पर काम करने वाला एक समाधान खोजने की उम्मीद है
अधिक जानकारी: मैं इन वक्तव्य का उपयोग कर रहा हूं। जब उपयोगकर्ता मैन्युअल रूप से सामने लाने के लिए एक विंडो का चयन करता है, तो वे ठीक काम करते हैं। लेकिन यह तब काम नहीं करता जब ऐप खुद सामने की खिड़की ला रहा है।
AXObserverAddNotification(observer, element, kAXMainWindowChangedNotification, 0);
AXObserverAddNotification(observer, element, kAXFocusedWindowChangedNotification, 0);
मैं वर्तमान विंडो परिवर्तनों की सदस्यता लेने में असमर्थ हूं, लेकिन आप वर्तमान एप्लिकेशन के लिए पहुंच API को पूछ सकते हैं, और वर्तमान अनुप्रयोगों में अधिकांश अग्रभूमि विंडो
कल्पना कीजिए कि आपके पास वर्तमान डेटाडेटाडेटाडेटा है, निम्न डेटा के साथ:
@interface CurrentAppData : NSObject {
NSString* _title;
AXUIElementRef _systemWide;
AXUIElementRef _app;
AXUIElementRef _window;
}
मौजूदा एप्लिकेशन को खोजने के लिए कोड कुछ ऐसा दिखता है:
-(void) updateCurrentApplication {
// get the currently active application
_app = (AXUIElementRef)[CurrentAppData
valueOfExistingAttribute:kAXFocusedApplicationAttribute
ofUIElement:_systemWide];
// Get the window that has focus for this application
_window = (AXUIElementRef)[CurrentAppData
valueOfExistingAttribute:kAXFocusedWindowAttribute
ofUIElement:_app];
NSString* appName = [CurrentAppData descriptionOfValue:_window
beingVerbose:TRUE];
[self setTitle:appName];
}
इस उदाहरण में _systemWide चर वर्गों init फ़ंक्शन के रूप में प्रारंभ किया जाता है: _system = AXUIElementCreateSystemWide ();
क्लास फंक्शन वैल्यूएफ़एक्सिंगएट्रीब्यूशन इस तरह दिखता है:
// -------------------------------------------------------------------------------
// valueOfExistingAttribute:attribute:element
//
// Given a uiElement and its attribute, return the value of an accessibility
// object's attribute.
// -------------------------------------------------------------------------------
+ (id)valueOfExistingAttribute:(CFStringRef)attribute ofUIElement:(AXUIElementRef)element
{
id result = nil;
NSArray *attrNames;
if (AXUIElementCopyAttributeNames(element, (CFArrayRef *)&attrNames) == kAXErrorSuccess)
{
if ( [attrNames indexOfObject:(NSString *)attribute] != NSNotFound
&&
AXUIElementCopyAttributeValue(element, attribute, (CFTypeRef *)&result) == kAXErrorSuccess
)
{
[result autorelease];
}
[attrNames release];
}
return result;
}
पिछले फ़ंक्शन को ऐप्पल UIElement इंस्पेक्टर उदाहरण से लिया गया था, जो एक्सेसिबी एपीआई के बारे में सीखने के लिए एक महान संसाधन भी है।
मैक ओएस एक्स में, अनुप्रयोगों और खिड़कियां पूरी तरह से अलग चीजें हैं, जिसमें खिड़कियों वाले अनुप्रयोग हैं; वे माइक्रोसॉफ्ट विंडोज के तौर पर पहले ही नहीं हैं। आपको प्रत्येक एप्लिकेशन के सक्रियण और निष्क्रियकरण का पता लगाना होगा।
आप ऐसा करेंगे कि kAXApplicationActivatedNotification
और kAXApplicationDeactivatedNotification
लिए देखकर kAXApplicationActivatedNotification
kAXApplicationDeactivatedNotification
। इन नोटिफिकेशन का ऑब्जेक्ट सक्रिय रूप से सक्रिय है और निष्क्रिय है। आपको लॉन्च करने और छोड़ने वाले ऐप्लिकेशन का पता लगाना भी होगा; आप प्रक्रिया प्रबंधक या NSWorkspace का उपयोग कर ऐसा कर सकते हैं उन दोनों एपीआई आपको एक प्रोसेस आईडी दे सकते हैं, जिसका उपयोग आप एक एक्सा ऍप्लिकेशंस ऑब्जेक्ट बनाने के लिए कर सकते हैं।
डेवलपर दस्तावेज़ में iChatStatusFromApplication उदाहरण पर एक नज़र डालें। यह वास्तव में आपको क्या चाहिए :)