2010-01-11 12 views
15

क्या कोई जानता है कि शीर्ष सक्रिय विंडो के पीआईडी ​​कैसे प्राप्त करें और फिर पीआईडी ​​का उपयोग करके विंडो के गुण कैसे प्राप्त करें? मेरा मतलब है प्रक्रिया प्रक्रिया, प्रोग्राम नाम, आदि जैसे गुणशीर्षतम विंडो के लिए पिड और विवरण प्राप्त करना

मैं लिनक्स (उबंटू 9 .10) के तहत क्यूटी का उपयोग कर रहा हूं।

+0

आपका ऐप अपनी खुद की पिड जानता है, क्या आप चाहते हैं? – Tobu

+2

क्यूटी एक भाषा नहीं है, यह टूलकिट है। क्यूटी सी ++ में लिखा गया है, लेकिन कई अन्य भाषाओं के लिए बाइंडिंग है। क्या आप सी ++ का उपयोग कर रहे हैं? –

+0

@ जेम्सपोली क्यूटी पूरी तरह से एक भाषा के विपरीत नहीं है जिसमें यह 'एक बार लिखना, हर जगह संकलित' उपकरण के रूप में कार्य कर सकता है, जहां पीओएसआईक्स कॉल जैसे कुछ पोर्टिंग को WinAPI, एंड्रॉइड इत्यादि के लिए अलग कोड लिखने की आवश्यकता होगी .. – Wyatt8740

उत्तर

5

एक विंडो मालिक का पीआईडी ​​एक्स संपत्ति _NET_WM_PID में संग्रहीत है। ध्यान दें कि यह केवल एक वास्तविक तथ्य है।

आपको पहले विंडो की आईडी खोजनी है, तो आप संपत्ति के लिए पूछ सकते हैं। मुझे किसी भी अमूर्तता के बारे में पता नहीं है QT इसके लिए प्रदान करता है, इसलिए आपको शायद xlib या xcb का उपयोग करना होगा।

स्टार्टर्स के लिए टूल xprop के साथ खेलो।

5

xlib's XGetInputFocus आपको बताएगा कि कौन सी विंडो फोकस कर रही है, जो शायद सबसे ज्यादा दिलचस्प है। सी एफ एक्सफ्री 86 का XGetInputFocus manpage

यदि यह वास्तव में सबसे ऊपर की खिड़की है, और खिड़की के साथ-साथ फोकस नहीं है, तो मुझे नहीं लगता कि ऐसा करने के लिए एक सरल कॉल है, क्योंकि xlib किसी भी तरह से पेश नहीं करता है वैश्विक स्टैकिंग ऑर्डर की पूछताछ करने के लिए, जो डेटा संरचना है जो आपको बताती है कि कौन सी खिड़कियां सामने हैं।

एक बार जब आप सही खिड़की आईडी होना, xprop _NET_WM_PID_ तहत पीआईडी ​​सूची जाएगा - हालांकि नहीं सभी खिड़कियां इस तरह के एक संपत्ति है ...

पोस्टस्क्रिप्ट अधिक विचार; लंबे समय के बाद से मैं xlib के बारे में सोचा है ...

संक्षेप में:

  1. एक्स खिड़की आईडी और पीआईडी ​​के बीच किसी भी विश्वसनीय संघ प्रदान नहीं करता है, और जैसा कि Noufal का मानना ​​है, खिड़कियां एक एक्स पर सेवा डेस्कटॉप कई अलग-अलग मशीनों से आ सकता है, और दो रिमोट क्लाइंट एक ही पीआईडी ​​का उपयोग करने के लिए हो सकते हैं, क्योंकि यह केवल प्रति मशीन अद्वितीय है। सी एफ How to get an X11 Window from a Process ID?

  2. एक्स एक इंटरफ़ेस पेश नहीं करता है जो पूछता है कि सबसे ऊपर की खिड़की कौन है, या एक खिड़की दूसरे को गुज़रती है या नहीं। इसी प्रकार विशेषाधिकार प्राप्त पहुंच के साथ ... सीएफ। How to identify top-level X11 windows using xlib?

  3. सामान्य रूप से उपलब्ध खिड़की प्रबंधकों और क्यूटी आप एक्स

  4. के लिए विशेषाधिकार प्राप्त पहुँच दोनों के बिना, सर्वोच्च खिड़की खोजने का एक तरीका है और मेल खाने पीआईडी ​​को खिड़की आईडी की एक विश्वसनीय संघ देना नहीं है हम सवाल हल नहीं कर सकते हैं।

  5. हम पाते हैं कि कौन सी विंडो फोकस कर रही है, और शायद यही वह है जो हम चाहते हैं। लेकिन फिर, पीआईडी ​​नक्शा करने के लिए wid ... बिना

तो, माफ करना, ऐसा लगता है कि यह नहीं किया जा सकता लग रहा है।

0

wmctrl (भंडारों से) स्थापित करें। wmctrl -lp आप जो चाहते हैं हो सकता है। यदि आपको अपने कार्यक्रम से इसकी आवश्यकता है तो आप हमेशा स्रोत पर एक नज़र डाल सकते हैं।

+0

सीएफ। -p विकल्प के बारे में wmctrl क्या कहता है: "विंडो सूची में पीआईडी ​​शामिल करें। बहुत कम एक्स अनुप्रयोग इस सुविधा का समर्थन करते हैं।" ध्यान दें कि डब्ल्यूएम ईडब्लूएमएच का समर्थन कर सकता है या नहीं; क्यूटी का उपयोग गैर-अनुरूप डब्ल्यूएम के साथ किया जा सकता है। –

19

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

क्या आप जो कुछ करना चाहते हैं उस पर थोड़ा सा विस्तार कर सकते हैं? मुझे लगता है कि यहां कुछ लापता विवरण हैं। आदर्श रूप में, आपको मशीन विशिष्ट के बजाए एक्स स्तर पर काम करना चाहिए।

+0

मेरी इच्छा है कि मैं इसे +2 कर सकता हूं। – asveikau

+0

आपके समर्थन के लिए धन्यवाद। :) –

+1

फोकस वाली विंडो शीर्ष पर नहीं होनी चाहिए। –

24

लिनक्स कॉल xprop में एक कमांड है जो एक्स सर्वर में विंडो गुणों को प्रदर्शित करने के लिए उपयोगिता है। लिनक्स xprop -root में आपको रूट विंडोज गुण और अन्य सक्रिय प्रोग्राम भी मिलते हैं।

xprop -root | grep _NET_ACTIVE_WINDOW\(WINDOW\) 

सिर्फ सक्रिय विंडो आईडी प्राप्त करने के लिए: तो आप इस आदेश का उपयोग कर सक्रिय विंडो के आईडी प्राप्त कर सकते हैं (बिना "_NET_ACTIVE_WINDOW (विंडो): खिड़की आईडी #" पंक्ति के आरंभ में) का उपयोग इस आदेश:

myid=xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}' 

xprop एक विशेषता कॉल मैं है:

xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}' 

अब आप एक उपयोगकर्ता निर्धारित चर में इस आदेश का उत्पादन बचा सकता है घ। यह तर्क उपयोगकर्ता को कमांड लाइन पर विंडो आईडी का चयन करने की अनुमति देता है। हम उत्पादन में _NET_WM_PID (कार्डिनल) के लिए दिखना चाहिए ... तो हम इस आदेश का उपयोग करें:

xprop -id $myid | awk '/_NET_WM_PID\(CARDINAL\)/{print $NF}' 

यह आप सर्वोच्च सक्रिय विंडो प्रक्रिया ID देता है।

अधिक Trickey हो सकता है और सिर्फ 1 आदेश में सभी काम करने के लिए ...:

xprop -id $(xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}') | awk '/_NET_WM_PID\(CARDINAL\)/{print $NF}' 

अब मैं इन आदेशों मेरी सी के माध्यम से ++ प्रोग्राम चला सकते हैं (linux में) popen समारोह, हड़पने stdout और प्रिंट का उपयोग कर या बचाओ। पॉपन एक पाइप बनाता है ताकि हम उस कार्यक्रम के आउटपुट को पढ़ सकें जिसे हम आमंत्रित कर रहे हैं।

(आप भी उपयोग करें '/ proc' फाइल सिस्टम कर सकते हैं और एक पीआईडी ​​('/ proc/YOUR_PID/स्थिति') का अधिक विवरण प्राप्त)

#include <string> 
#include <iostream> 
#include <stdio.h> 
using namespace std; 

inline std::string exec(char* cmd) { 
    FILE* pipe = popen(cmd, "r"); 
    if (!pipe) return "ERROR"; 
    char buffer[128]; 
    std::string result = ""; 
    while(!feof(pipe)) { 
     if(fgets(buffer, 128, pipe) != NULL) 
       result += buffer; 
    } 
    pclose(pipe); 
    return result; 
} 

int main() 
{ 
    //we uses \\ instead of \ (\ is a escape character) in this string 
cout << exec("xprop -id $(xprop -root | awk '/_NET_ACTIVE_WINDOW\\(WINDOW\\)/{print $NF}') | awk '/_NET_WM_PID\\(CARDINAL\\)/{print $NF}'").c_str(); 
return 0; 
} 
+0

लेकिन ध्यान दें कि यह अक्सर असफल हो जाएगा क्योंकि कई अन्य उत्तरों ने ध्यान दिया है, _NET_WM_PID एक विशेषता है जो अक्सर वहां नहीं होती है। –

+0

हाँ, मैंने अभी कोशिश की है और _NET_WM_PID अनुपस्थित है – cheshirekow

+4

क्या आप जानते हैं कि आप xprop कमांड लाइन पर चर निर्दिष्ट कर सकते हैं? जैसे 'xprop _NET_WM_PID -id $ window_id' में – nonchip

2

मैं Michel Kogan’s answer अप मतदान रहा हूँ, और जोड़ने इसे इस संक्षिप्त सारांश:

ps -o pid,comm,args $(xprop -id $(xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}") -f _NET_WM_PID 0c " \$0\\n" _NET_WM_PID | awk "{print \$2}") 

ऊपर वर्तमान में सक्रिय विंडो के लिए निम्नलिखित दिखाएगा: पीआईडी, आदेश का नाम (केवल निष्पादन योग्य नाम), अपने सभी तर्क के साथ आदेश।

5

पार्टी के लिए बहुत देर हो चुकी है, लेकिन मुझे एक ही समस्या थी, और मुझे लगता है कि यह किसी और की मदद कर सकता है जिसकी एक ही समस्या है। यह करने के लिए एक कमांड लाइन चाल नहीं है, तो आप इसे execvp'ing, या अपने कोड

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) _NET_WM_NAME WM_CLASS 

के उत्पादन पुनः निर्देशित यह क्रियान्वित करने की कोशिश कर सकते खिड़की नाम है, साथ ही प्रोग्राम का नाम देता है। जैसे, इस टैब के लिए, यह मेरे देता

_NET_WM_NAME(UTF8_STRING) = "linux - Getting pid and details for topmost window - Stack Overflow - Mozilla Firefox" 

WM_CLASS(STRING) = "Navigator", "Firefox" 
संबंधित मुद्दे