如何在 Linux 上使用 Python 实现相同的行为(隐藏任务栏上的
python.exe
)? (我的目标主要是Raspbian(LXDE)和Gnome)
wx
或 pygame
作为窗口提供程序,因为我已经使用了一个(sdl2
),因此它可能需要精确地进行某种调用就像win32gui
一样。
显然我还没有尝试过任何东西,因为我不知道从哪里开始,所以即使是一些想法也可能有帮助。
Xorg 就是这样。如果您没有,请继续进一步搜索。
基本上,你可以调用这个命令:
xprop -name <unique window name> -f _NET_WM_STATE 32a \
-set _NET_WM_STATE _NET_WM_STATE_SKIP_TASKBAR
或
xprop -id <window id> -f _NET_WM_STATE 32a \
-set _NET_WM_STATE _NET_WM_STATE_SKIP_TASKBAR
从任务栏中删除某些内容,窗口管理器应该尊重这一点。
Ubuntu 的 Unity 很特别,因此如果您有多个窗口堆叠在单个任务栏图标上,它要么忽略该命令,要么已经使用该命令,将图标堆叠到侧面带有小箭头的单个图标中。
我还没有找到隐藏它的方法。请随时联系我。
有一个使用 xlib 隐藏它的解决方案(此代码是用 C 编写的,但您可以使用
python-xlib
找到与 python 等效的代码):
#include <X11/Xlib.h>
#include <X11/Xatom.h>
int x11_hide_icon(Display *dpy, Window xid)
{
Atom wmStateSkipTaskbar = XInternAtom( dpy, "_NET_WM_STATE_SKIP_TASKBAR", 1 );
if( wmStateSkipTaskbar != None ) {
printf( "_NET_WM_STATE_ABOVE has atom of %ld\n", (long)wmStateSkipTaskbar );
} else {
printf( "ERROR: cannot find atom for _NET_WM_STATE_ABOVE !\n" );
return False;
}
Atom wmNetWmState = XInternAtom( dpy, "_NET_WM_STATE", 1 );
if( wmNetWmState != None ) {
printf( "_NET_WM_STATE has atom of %ld\n", (long)wmNetWmState );
} else {
printf( "ERROR: cannot find atom for _NET_WM_STATE !\n" );
return False;
}
if( wmStateSkipTaskbar != None )
{
XClientMessageEvent xclient;
memset( &xclient, 0, sizeof (xclient) );
xclient.type = ClientMessage;
xclient.window = xid;
xclient.message_type = wmNetWmState;
xclient.format = 32;
xclient.data.l[0] = _NET_WM_STATE_ADD;
xclient.data.l[1] = wmStateSkipTaskbar; // this propery is to hide window with xid
xclient.data.l[2] = 0;
xclient.data.l[3] = 0;
xclient.data.l[4] = 0;
Window root_window = XRootWindow(dpy, 0);
XSendEvent( dpy,
root_window, // <-- DefaultRootWindow( dpy )
False,
SubstructureRedirectMask | SubstructureNotifyMask,
(XEvent *)&xclient );
XFlush(dpy);
return true;
}
return false;
}