老板键是很多应用程序提供的一键隐藏窗口功能。但也有很多应用不支持。作为程序员或者打算入门的我们,当然是要自己写一个啊。
Python本身是不支持操作Window窗口的,但我们可以用pip安装pywin32来实现调用Windows SDK API, 这个包其实是C++程序函数的封装,基本上是一一对应的关系。
首先,我们需要找到程序的hwnd, 这个以前翻译成句柄,生造出来的术语,其实就是一个指针,指向程序在内存中的地址。虽然有findwindow这个函数,但需要知道窗口使用的Class名, 而这个需要用Virtual Studio带的工具Spy++才能找到。
按上图的步骤就可以找到我们需要的Class名
但是我找到一种更简单的方法,用EnumWindows函数遍历当前所有程序,如果窗口名等于我们要找的程序,返回hwnd就好了。EnumWindows很简单,提供一个回调函数就可以。在回调函数里保存我们需要的hwnd就好了。
代码如下:
在Callback函数里用到两个函数,GetWindowRect是取出窗口的坐标。GetWindowText是取出窗口的名字。如果名字相同的话,我们就把hwnd存在类变量里供其它函数使用。
要隐藏程序有很多方法,一种是隐藏到桌面托盘上,但那个是需要该程序本身支持托盘。一种是缩小窗口到看不见内容,这个很简单到,用move_window函数就可以做到,只需要提供坐标值,宽与高即可。
如果你使用的是Windows 10, 它自带的工作区功能天生就是隐藏程序的好地方。然而微软没有提供相应的API去移动窗口到指定的工作区。没关系,我们能用键盘实现的功能就可以用程序实现。
用键盘操作的话,用Win+tab键显示窗口微缩图,用Shift+F10键显示右键快捷菜单,再用方向键选择对应菜单项即可。pywin32用keybd_event就可以实现完全自动化操作。程序如下
这里用shortcut做一个简单的封装,首先我们调用keybd_event模拟按下键盘,然后再模拟键盘抬起事件,这样windows就会认为是一个快捷键组合。keyup事件是必须调用的,不然即使你的程序已经结束,但调用的键位会一直保持按下的状态。
在move_next_workspace里, 我们加了time.sleep方法,这个是根据机器反应速度可以做相应调整的。如果太快,界面没出来,快捷键触发就会发生在错误的窗口。
最后,实现简单的老板键功能就已经完成了。但如果你想切换到其它工作区的话,快捷键就不好用了。因为傻傻的微软程序是按workspace的名字排序菜单,这样你在工作区2调用程序的话,就会返回到工作区1,而不是你想要的工作区3。如果想实现这个功能的话,就需要精确拿到对应的菜单,用pyautogui就可以实现了,详情请参阅我以前的文章。