簡體   English   中英

X11 - 如何使用Python引發另一個應用程序的窗口

[英]X11 - How to raise another application's window using Python

我希望能夠使用Python提出另一個應用程序的窗口。

我確實看到了這個,我想我可以試試:

X11:通過命令行提升現有窗口?

但是,如果可能的話,我寧願用Python來做。

要激活另一個窗口,在Xlib協議層上執行的正確操作是發送_NET_ACTIVE_WINDOW消息,如EWMH規范中所述http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html

這可以使用python-xlib(推測)或使用GDK通過pygtk在外部GdkWindow上使用gdk_window_focus()來完成

_NET_ACTIVE_WINDOW優於XRaiseWindow(),並且多年來一直存在於所有重要的WM中。

你應該避免XSetInputFocus(),這將導致問題(特別是如果你得到時間戳錯誤)。 問題是WM無法攔截SetInputFocus(),因此它會導致奇怪的競爭條件和UI不一致。

真的只有_NET_ACTIVE_WINDOW正常工作,這就是它被發明的原因,因為以前的黑客攻擊都很糟糕。

有一個名為libwnck的庫可以讓你激活windows(除其他外),但不幸的是它增加了很多開銷,因為它總是跟蹤任何應用程序中的所有打開的窗口,即使你不需要這樣做。 但是,如果你想反正追蹤從其他應用程序窗口,然后libwnck具有的功能,以激活那些做正確的事的窗口和將是一個不錯的選擇。

嚴格正確的方法是檢查EWMH _NET_ACTIVE_WINDOW支持(EWMH文檔如何執行此操作),如果WM沒有_NET_ACTIVE_WINDOW,則回退到XRaiseWindow。 但是,由於過去多年來積極開展工作的任何WM都有EWMH,很多人都對傳統WM的后備很懶。

你可以看看python ewmh包 文檔包含示例,但以下是如何實現您的目標:

from ewmh import EWMH
import random
ewmh = EWMH()

# get every displayed windows
wins = ewmh.getClientList()

# let's active one window randomly
ewmh.setActiveWindow(random.choice(wins))

# flush requests - that's actually do the real job
ewmh.display.flush()

你需要使用python-xlib並在窗口對象上調用.circulate(Xlib.X.RaiseLowest) (可以通過許多不同的方式識別 - 無法猜測哪一個適合你,從零數量關於它的信息在你的Q ;-)。 有關使用python-xlib一個很好的例子,請查看tinywm窗口管理器 - 在C版本之后,作者提供了一個Python版本,它需要大約30個非空白的非注釋行(對於一個可用的,如果很小的窗口)經理 ......! - )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM