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