2008-12-07 8 views
9

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

मेरा एप्लिकेशन कैसे पता लगा सकता है जब कोई अन्य एप्लिकेशन विंडो को सामने लाए, इसे बिना कुंजी के लाए? मैं इस समय इन बयानों का उपयोग कर रहा:

मैं एक समाधान है कि OS X 10.4 और 10.5

अधिक जानकारी पर काम करता है खोजने के लिए उम्मीद कर रहा हूँ। जब उपयोगकर्ता मैन्युअल रूप से इसे सामने लाने के लिए विंडो चुनता है तो वे ठीक काम करते हैं। लेकिन जब यह ऐप स्वयं खिड़की को सामने ला रहा है तो यह काम नहीं करता है।

AXObserverAddNotification(observer, element, kAXMainWindowChangedNotification, 0); 
AXObserverAddNotification(observer, element, kAXFocusedWindowChangedNotification, 0); 

उत्तर

7

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

-(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 चर रहा है में: वर्तमान आवेदन इस तरह दिखता है खोजने के लिए

@interface CurrentAppData : NSObject { 
    NSString* _title; 
    AXUIElementRef _systemWide; 
    AXUIElementRef _app; 
    AXUIElementRef _window; 
} 

कोड:

कल्पना कीजिए कि आप एक वर्ग CurrentAppData कहा जाता है, निम्न डेटा के साथ कक्षा init फ़ंक्शन में प्रारंभ में: _system = AXUIElementCreateSystemWide();

वर्ग समारोह valueOfExistingAttribute इस तरह दिखता है:

// ------------------------------------------------------------------------------- 
// 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; 
} 

पिछले समारोह एप्पल UIElementInspector उदाहरण है, जो भी पहुँच क्षमता एपीआई के बारे में सीखने के लिए एक महान संसाधन है से लिया गया है।

5

मैक ओएस एक्स में, एप्लिकेशन और विंडोज़ पूरी तरह से अलग चीजें हैं, जिसमें विंडोज़ वाले अनुप्रयोग हैं; वे पहले माइक्रोसॉफ्ट विंडोज के समान नहीं हैं। आपको प्रत्येक एप्लिकेशन की सक्रियण और निष्क्रियता का पता लगाने की आवश्यकता है।

आप kAXApplicationActivatedNotification और kAXApplicationDeactivatedNotification देखकर ऐसा करेंगे। इन अधिसूचनाओं का उद्देश्य एप्लिकेशन सक्रिय और निष्क्रिय किया जा रहा है। आपको लॉन्च करने और छोड़ने के अनुप्रयोगों को भी पहचानने की आवश्यकता होगी; आप प्रोसेस मैनेजर या एनएसवर्क्स स्पेस का उपयोग करके ऐसा कर सकते हैं। उन दोनों एपीआई आपको एक प्रोसेस आईडी दे सकते हैं, जिसका उपयोग आप AXAplication ऑब्जेक्ट बनाने के लिए कर सकते हैं।

3

डेवलपर दस्तावेज़ में iChatStatusFromApplication उदाहरण पर एक नज़र डालें। यह वही है जो आपको चाहिए :)

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