linux - अधिकतम विंडो के लिए पीआईडी ​​और विवरण प्राप्त करना




qt pid (6)

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

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


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


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

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


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

xprop -root | grep _NET_ACTIVE_WINDOW\(WINDOW\)

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

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

अब आप इस कमांड आउटपुट को उपयोगकर्ता परिभाषित चर में सहेज सकते हैं:

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

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

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

यह आपको सबसे सक्रिय विंडो प्रक्रिया आईडी देता है

अधिक कुशल होने के लिए और सब कुछ सिर्फ 1 कमांड में करें ...:

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

अब मैं इन कमांडों को अपने सी + + प्रोग्राम (लिनक्स में) पॉपने फ़ंक्शन, स्टडआउट को पकड़ कर प्रिंट करके या इसे सहेज कर रख सकता हूँ। पॉपयन एक पाइप बनाता है ताकि हम उस प्रोग्राम के आउटपुट को पढ़ सकें जो हम शुरू कर रहे हैं।

(आप '/ 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;
}

पार्टी में बहुत देर हो चुकी है, लेकिन मुझे एक ऐसी ही समस्या थी, और मुझे लगता है कि इससे कोई अन्य व्यक्ति की सहायता कर सकता है जिसकी समस्या एक समान है। ऐसा करने के लिए एक कमांड लाइन चाल है, आप इसे 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 -  - Mozilla Firefox"

WM_CLASS(STRING) = "Navigator", "Firefox"

xlib के XGetInputFocus आपको बताएगा कि किस विंडो पर फ़ोकस है, जो शायद सबसे अधिक रोचक है जो सबसे ऊपर है सी एफ एक्सफ़्री 86 का एक्सगेट इन्पुटफोकस मैनपेज

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

आपके पास सही विंडो आईडी हो जाने के बाद, xprop _NET_WM_PID_ के तहत पीआईडी ​​की सूची देगा - हालांकि सभी विंडो की ऐसी संपत्ति नहीं है ...

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

संक्षेपित करते हुए:

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

  2. एक्स एक पूछताछ नहीं देता प्रतीत होता है जो सबसे ऊपर की खिड़की है, या क्या एक खिड़की एक और दखल है इसी तरह विशेषाधिकार प्राप्त पहुंच के साथ ... सीएफ Xlib का उपयोग करके शीर्ष-स्तरीय X11 विंडो कैसे पहचानें?

  3. आम तौर पर उपलब्ध विंडो प्रबंधक और क्यूटी आपको X तक विशेषाधिकार प्राप्त पहुंच नहीं देते हैं

  4. सबसे ऊंची खिड़की खोजने का एक तरीका है, और मेल आईडी के लिए विंडो आईडी का एक विश्वसनीय सहयोग, हम सवाल को हल नहीं कर सकते।

  5. हमें पता चलता है कि किस विंडो पर फ़ोकस है, और यह शायद हम क्या चाहते हैं लेकिन फिर से, पीड के बिना मानचित्र के लिए ...

इसलिए, खेद है, ऐसा लगता है कि ऐसा नहीं किया जा सकता।


मैं मिशेल कोगन के उत्तर में मतदान कर रहा हूं, और इसका संक्षिप्त सारांश जोड़ रहा हूं:

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}")

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







xlib