bạn cũng có thể tra cứu PID với wmctrl, và thực tế là tôi nghĩ đó là cách tốt hơn để thực hiện. xwininfo sẽ trả về tất cả các loại thực thể xuất hiện dưới dạng cửa sổ, nhưng bạn sẽ không thực sự tìm thấy chúng trên màn hình của mình.
Nếu bạn làm người wmctrl , bạn sẽ thấy rằng wmctrl -l liệt kê tất cả cửa sổ đang thực sự có thể nhìn thấy trên màn hình desktop của bạn với (quan trọng nhất) cửa sổ id của họ và tiêu đề. -p thêm PIDs và -x sẽ thêm lớp cửa sổ.
Khi hướng dẫn sử dụng cho biết (RTFM, phải?: D), wmctrl cũng có thể tìm kiếm thông qua một số trong số này và kích hoạt cửa sổ khớp với tìm kiếm. Tuy nhiên, tôi không có ý tưởng gì xác định mà một trong tất cả các trận đấu có thể sẽ được trả lại. Mặt khác, bạn có thể sử dụng hàm liệt kê được cung cấp để viết một trình bao tìm kiếm tốt hơn và có thể dựa trên một số thuộc tính khác (chẳng hạn như dấu thời gian của lần truy cập cuối cùng vào cửa sổ) mà bạn có thể nhận được bằng cách truy vấn được cung cấp Ví dụ: hãy giành mã số id thành xprop.
Những dòng mã dưới đây trả lại ví dụ gần đây nhất một cửa sổ lớp người bạn đời-thiết bị đầu cuối:
XTIME="_NET_WM_USER_TIME" #a shorter name for xprop query that shoul return timestamps
export TMPDIR=/dev/shm #save tmp files to memory to make it faster
LST=`mktemp` #tmp file to store our listing
wmctrl -lx | awk -F' ' '{printf("%s\t%s \t",$1,$3); for(i=5;i<=NF;i++) printf("%s",$i); printf("\n") }' > $LST #pretty-print our listing of windows into the tmp file
#To each line of listing, prepend a timestamp acquired via an xprop call
#Use awk to find a line whose 3rd column (winclass) matches the window class "mate-terminal.Mate-terminal" and among those that do, find the one whose timestamp is the largest
while read LINE; do ID=`echo "$LINE"|cut -f 1`; TIME=`xprop -id $ID $XTIME`; TIME="${TIME/* = /}"; echo -e "$TIME\t$LINE" ; done <$LST) | awk -v s="mate-terminal.Mate-terminal" '$3 == s {if($1>max){max=$1;line=$0};};END{print line}'
rm $LST #delete tmp file
Nhưng dù sao, đối với điều mà bạn mô tả bạn đang xây dựng-nếu tôi là bạn, tôi sẽ tìm hiểu những gì lớp của cửa sổ lệnh mong muốn của bạn tạo ra và sau đó căn cứ tìm kiếm của tôi trên đó, chứ không phải trên PID. Ngoài ra, bạn có thể đoán rằng lệnh CMD có thể sẽ tạo ra các cửa sổ với một tên lớp bao gồm CMD.
Sau khi bạn đã tìm thấy đường của mình, bạn nên sử dụng mã cửa sổ
để kích hoạt cửa sổ qua wmctrl.
Hy vọng điều này sẽ hữu ích.
Một lưu ý phụ: Tôi thấy rằng xdotool có thể thực hiện tìm kiếm dựa trên tên lớp và tiêu đề cửa sổ, nhưng nó là cực kỳ chậm. Trên máy tính của tôi, tập lệnh bash này (gọi là khá nhiều tiện ích bên ngoài) nhanh gấp 10 lần so với phương pháp được biên dịch là xdotool: P.
Cảm ơn. Tôi bắt đầu hacking xung quanh với mã này khi bạn ban đầu đăng nó, nhưng tôi đã boggled và sau đó sidetracked (do đó chấp nhận hối tiếc đáng tiếc) ... vẫn, điều này dường như được cho tôi chỉ muốn tôi muốn. –
Một lớp lót sẽ làm điều đó (ăn cắp từ Patrick) khi bạn có thể dễ dàng chọn cửa sổ bạn quan tâm là 'xwininfo | sed -e 's/^ * //' | grep -E "Id cửa sổ" | awk '{print $ 4}' '. Chạy xwininfo không có đối số hoặc chuyển mạch cho phép bạn chọn bằng chuột của bạn cửa sổ bạn muốn biết. LƯU Ý: Tôi đã phải thay đổi lệnh grep một chút cho RHEL6. – MrMas