กำลังตรวจหาหน้าต่างที่ใช้งานอยู่ในปัจจุบัน


52

เครื่องมือบรรทัดคำสั่ง linux wmctrlช่วยให้คุณสามารถแสดงรายการหน้าต่างทั้งหมดหรือเดสก์ท็อปทั้งหมดท่ามกลางสิ่งอื่น ๆ ในโหมดรายชื่อเดสก์ท็อปเดสก์ท็อปปัจจุบันจะถูกทำเครื่องหมายด้วยเครื่องหมายดอกจัน

ฉันต้องการเครื่องมือที่สามารถค้นหาชื่อหน้าต่างที่ใช้งานในปัจจุบัน น่าเสียดายที่wmctrlไม่มีผู้ช่วยที่ทำสิ่งนี้ - แม้ว่าจะรู้ว่าหน้าต่างใดเปิดใช้งานอยู่ในปัจจุบัน (ดู:ACTIVE:เครื่องหมาย)

มีเครื่องมือ commandline อื่นที่สามารถให้ id หน้าต่างและ / หรือชื่อหน้าต่างของหน้าต่างปัจจุบันได้หรือไม่

คำตอบ:


56

ติดตั้งxdotoolแล้วเรียกใช้

xdotool getwindowfocus getwindowname

มันจะให้เช่นสำหรับหน้าเว็บปัจจุบันที่เปิดใน Firefox:

linux - Detecting currently active window - Super User - Mozilla Firefox

เครื่องมือที่มีประสิทธิภาพ! นอกเหนือจากการใช้งานหน้าต่างปัจจุบันมันยังมีฟังก์ชั่นที่มีประโยชน์อื่น ๆ อีกมากมาย
Searene

เมื่อเทียบกับคำตอบของ Jim Paris สิ่งนี้มีข้อเสียของการพึ่งพาการติดตั้ง แต่ดูเหมือนว่าจะทำงานได้เร็วขึ้นโดยเฉพาะถ้า xdotool อยู่ในแคชดิสก์อยู่แล้ว
mc0e

1
หากคุณต้องการจัดการกับหน้าต่างปัจจุบันด้วยwmctrlคุณสามารถทำได้: wmctrl -i -r `xdotool getwindowfocus` -e 0,10,10,-1,-1โดย-iบอก wmctrl ให้คาดหวังว่า id หน้าต่างแทนที่จะเป็นชื่อหน้าต่าง
fiedl

34

นี่คือการใช้โดยตรงมากขึ้นเท่านั้นxpropและcut:

xprop -id $(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2) _NET_WM_NAME

คำสั่งเหล่านี้เป็นเพียงการแยกคุณสมบัติจากหน้าต่างรูทและหน้าต่างแอ็พพลิเคชัน แต่ตามคำขอของ Lorenzo von Matterhorn:

  • ครั้งแรก

    xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW
    

    แตก_NET_ACTIVE_WINDOWคุณสมบัติออกจากรูทซึ่งจะให้ XID ของหน้าต่างที่ใช้งานอยู่ การ32x '\t$0'บอกxpropให้จัดรูปแบบเอาต์พุตในวิธีที่cutสามารถแยกวิเคราะห์ในภายหลังได้อย่างง่ายดาย

  • จากนั้นแยกเฉพาะ XID จากเอาต์พุตด้วย cut -f 2

  • จากนั้นส่ง XID เป็นพารามิเตอร์ไป

    xprop -id XID _NET_WM_NAME
    

ซึ่งพิมพ์ชื่อของหน้าต่างนั้น


1
สวัสดีคุณช่วยอธิบายข้อโต้แย้งและไวยากรณ์หน่อยได้ไหม? มันอาจเป็นประโยชน์สำหรับ QA และผู้อ่านในอนาคต
Lorenzo Von Matterhorn

9

มี แต่ไม่มีคำตอบสั้น ๆ หรือวิธีแก้ปัญหา

$ wmctrl -lp | grep $(xprop -root | grep _NET_ACTIVE_WINDOW | head -1 | \
    awk '{print $5}' | sed 's/,//' | sed 's/^0x/0x0/')

ผลลัพธ์:

0x03800004  0 16459  xxxxxxxxxx /bin/bash

ในการใช้งาน:

$ for x in $(seq 1 10); do sleep 5; wmctrl -lp | grep $(xprop -root | \
    grep _NET_ACTIVE_WINDOW | head -1 | awk '{print $5}' | sed 's/,//' | \
    sed 's/^0x/0x0/'); done

0x03800004  0 16459  xxxxxxxxxx /bin/bash
0x020000a4  0 13524  xxxxxxxxxx linux - Detecting currently active window - Super User - Mozilla Firefox (Build 20120129142219)

1
ดูเหมือนว่าวิธีการแก้ปัญหาที่ดีไม่รู้เกี่ยวกับยูทิลิตี้ xprop ในระหว่างนี้ฉันได้ติดตั้ง wmctrl เพื่อให้ตัวเลือกดังกล่าวและส่งไปยังผู้เขียน น่าเสียดายที่ฉันยังไม่ได้รับคำตอบ
เดฟโฟกท์

1
+1 เพื่อประสิทธิภาพและ "ความเรียบง่าย" บนโค้ด
Lorenzo Von Matterhorn

5

นี่คือสิ่งที่ได้ผลสำหรับฉัน:

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

ให้:

WM_NAME(STRING) = "~"

ดังนั้นบางทีคุณอาจทำสิ่งที่น่าเกลียดเล็กน้อยเพื่อสร้างชื่อให้ตัวเอง:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | sed -e 's/.*"\(.*\)".*/\1/'

ให้:

~

ชื่อหน้าต่างของฉันที่เพ่งความสนใจไปในขณะนี้ทั้งหมดด้วยตัวเอง

หรือหลีกเลี่ยงการหมอบด้วยความน่าเกลียดน้อยกว่าเล็กน้อย:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | awk -F '"' '{print $2}'


1
หรือตั้งแต่การเจียระไนได้รับการแนะนำคุณสามารถใช้มันอีกครั้ง:xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | cut -d '"' -f 2
mc0e

3

ค่อนข้างสั้นและจัดการชื่อหน้าต่างที่มีเครื่องหมายคำพูดถูกต้อง:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | 
sed -nr 's/.*= "(.*)"$/\1/p'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.