我希望能够使用Python引发另一个应用程序的Window。

我确实看到了这一点,我想我可以尝试一下:

X11: raise an existing window via command line?

但是,如果可能的话,我宁愿在Python中执行此操作。

最佳答案

要激活另一个窗口,在Xlib协议(protocol)层上要做的正确的事是发送_NET_ACTIVE_WINDOW消息,如EWMH规范中所述。
http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html

可以使用python-xlib(大概)或在外部GdkWindow上使用gdk_window_focus()来完成,使用GDK通过pygtk

_NET_ACTIVE_WINDOW优于XRaiseWindow(),并且已经存在于所有重要的WM中很多年了。

您应该避免XSetInputFocus()会导致问题(尤其是如果时间戳错误的话)。问题是WM无法截获SetInputFocus(),因此会导致奇怪的竞争条件和UI不一致。

确实只有_NET_ACTIVE_WINDOW可以正常工作,这就是为什么它被发明的原因,因为以前的破解很糟糕。

有一个名为libwnck的库,它可以让您激活窗口(除其他外),但是不幸的是,它会增加很多开销,因为它始终跟踪任何应用程序中所有打开的窗口,即使您不需要这样做。但是,如果您仍然想跟踪其他应用程序的窗口,则libwnck具有激活执行正确操作的窗口的功能,这将是一个不错的选择。

严格正确的方法是检查EWMH _NET_ACTIVE_WINDOW支持(EWMH文档说明如何执行此操作),如果WM没有_NET_ACTIVE_WINDOW,则退回到XRaiseWindow。但是,由于最近几年一直在积极工作的任何WM都具有EWMH,因此许多人对遗留WM的后备状态感到懒惰。

关于python - X11-如何使用Python引发另一个应用程序的窗口,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2676434/

10-11 19:37