2008-12-16 8 views
17

का उपयोग कर ढूँढना वहाँ मैक ओएस एक्स पर एक निश्चित समय अजगर का उपयोग करने में वर्तमान में सक्रिय विंडो के आवेदन नाम खोजने के लिए एक तरीका है?मैक ओएस एक्स में वर्तमान सक्रिय विंडो अजगर

उत्तर

22

यह काम करना चाहिए:

#!/usr/bin/python 

from AppKit import NSWorkspace 
activeAppName = NSWorkspace.sharedWorkspace().activeApplication()['NSApplicationName'] 
print activeAppName 

केवल तेंदुए पर काम करता है, या टाइगर पर अगर आप PyObjC स्थापित और लाइन में सही अजगर बाइनरी (केस में बात करने के लिए हो तुम सार्वभौमिक स्थापित किया है, तो मैकपीथन, जो आप शायद टाइगर पर करना चाहते हैं)। लेकिन ऐसा करने के कार्बन तरीके से पीटर का जवाब शायद थोड़ा तेज होगा, क्योंकि पाइथन में एपकिट से कुछ भी आयात करने में कुछ समय लगता है, या अधिक सटीक रूप से, पाइथन प्रक्रिया में पहली बार एपकिट से कुछ आयात करने में कुछ समय लगता है।

आप एक PyObjC ऐप्लिकेशन के अंदर इस की जरूरत है, क्या मैं का वर्णन है, महान और तेजी से काम के बाद से आप केवल एक बार AppKit आयात करने के अंतराल का अनुभव होगा। यदि आपको कमांड लाइन उपकरण के रूप में काम करने की आवश्यकता है, तो आप प्रदर्शन हिट देखेंगे। यदि यह आपके लिए प्रासंगिक है, तो संभव है कि आप पीटर कोड को शुरुआती बिंदु के रूप में एक्सकोड में 10 लाइन फाउंडेशन कमांड लाइन टूल बनाने से बेहतर हो।

6

सबसे पहले, आप खिड़की या आवेदन नाम करना चाहते हैं? यह विंडोज नहीं है- मैक ओएस एक्स पर एक एप्लिकेशन प्रक्रिया में कई खिड़कियां हो सकती हैं। (इसके अलावा, यह भी विंडोज का सच कुछ वर्षों के लिए अब किया गया है, हालांकि मुझे पता नहीं क्या एपीआई कि के लिए की तरह लग रहा है।)

दूसरा, कार्बन या कोको?

कोको में सक्रिय विंडो पाने के लिए:

window = NSApp.mainWindow() 

कोको में अपनी प्रक्रिया के नाम पर प्राप्त करने के लिए:

appName = NSProcessInfo.processInfo().processName() 

संपादित करें: ओह, मुझे लगता मैं जानता हूँ कि आप क्या चाहते हैं। सामने की प्रक्रिया का नाम, है ना?

मैं वहाँ कोको में यह करने के लिए एक रास्ता है नहीं लगता है, लेकिन यहाँ कैसे सी में कार्बन में यह करना है:

ProcessSerialNumber psn = { 0L, 0L }; 
OSStatus err = GetFrontProcess(&psn); 
/*error check*/ 

CFStringRef processName = NULL; 
err = CopyProcessName(&psn, &processName); 
/*error check*/ 

जब आप इसे पूरा कर चुके हैं CFRelease(processName) करना न भूलें।

मुझे लगता है कि अजगर में कैसे दिखेंगे क्या यकीन नहीं है, या अगर यह भी संभव है। पायथन में पॉइंटर्स नहीं हैं, जो कि मुश्किल बनाता है।

मैं जानता हूँ कि PyObjC err, processName = CopyProcessName(…) में CopyProcessName के बाद तर्क अनुवाद होगा, लेकिन कार्बन बाइंडिंग PyObjC पर भरोसा नहीं करते हैं (वे कोर अजगर 2 का हिस्सा हैं), और मुझे यकीन है कि आप PSN के बारे में क्या करना है नहीं कर रहा हूँ किसी भी तरह से।

+0

एनएसएपीपी और एनएसपीक्रैस प्राप्त करने के लिए हमें आयात करने की क्या ज़रूरत है? – GreenAsJade

+0

@GreenAsJade: Dirk के उत्तर, संभवतः फाउंडेशन और ऐपकिट द्वारा जा रहा है। –

1

मैं Python स्क्रिप्ट है जो विंडो व्यवस्थित अच्छी तरह से मेरी स्क्रीन पर (move_window देखें) में वर्तमान frontmost आवेदन की जरूरत है।

बेशक, पूरा क्रेडिट पीटर को जाता है! gcc -framework Carbon filename.c

+1

यह पाइथन के लिए उत्तर कैसे है? – GreenAsJade

+0

पायथन के लिए भी नहीं, लेकिन नए योसेमेट जावास्क्रिप्ट स्वचालन के लिए आप '$ .NSWorkspace.sharedWorkspace.activeApplication.objectForKey ('NSApplicationName') का उपयोग कर सकते हैं। UTF8String;'। आपको इसे पहले आयात करने की आवश्यकता है हालांकि: 'ObjC.import (' AppKit ') '। – SirVer

12

स्वीकार किए जाते हैं जवाब में विधि ओएस एक्स 10.7+ में पदावनत किया गया था के साथ

#include <Carbon/Carbon.h> 

int main(int, char) { 
    ProcessSerialNumber psn = { 0L, 0L }; 
    OSStatus err = GetFrontProcess(&psn); 

    CFStringRef processName = NULL; 
    err = CopyProcessName(&psn, &processName); 
    printf("%s\n", CFStringGetCStringPtr(processName, NULL)); 
    CFRelease(processName); 
} 

बिल्ड: लेकिन यहाँ पूरा कार्यक्रम है।वर्तमान अनुशंसित संस्करण निम्न होगा:

from AppKit import NSWorkspace 
active_app_name = NSWorkspace.sharedWorkspace().frontmostApplication().localizedName() 
print(active_app_name) 
+0

यह वास्तव में मदद करता है! हम सक्रिय विंडो शीर्षक कैसे प्राप्त कर सकते हैं? –

+0

मुझे पता है कि ऐप्पलस्क्रिप्ट (इसे पायथन में ओस्क्रिप्ट के माध्यम से कॉल करना) का उपयोग करना संभव है, लेकिन मेरे ज्ञान तक, पाइथन में ऐसा करने का कोई सीधा तरीका नहीं है। कोको का उपयोग करके पुनर्प्राप्त की जा सकने वाली जानकारी की जांच करने के लिए यहां एक लिंक दिया गया है: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSWorkspace_Class/index.html#//apple_ref/occ/instm/NSWorkspace/frontmostAplication – kmundnic

+0

मूल रूप से हमने वर्तमान विंडो शीर्षक प्राप्त करने के लिए AppleScript का उपयोग किया, जो पूरी तरह से काम करता था। लेकिन अगर हमने ऐप पर हस्ताक्षर किए तो यह काम नहीं किया। और फिर मुझे क्वार्ट्ज में ऐसा करने के लिए एक मूल एपीआई मिला, और इससे हमारी समस्या हल हो गई। –