
最近利用pyautogui和tkinter写了一个类似按键精灵的小程序,然后突然想起了好多程序都有一个老板键的功能,就是按下热键界面就隐藏了,进入后台运行,再按一下就出来,为什么叫老板键,当然是为了上班摸鱼不被老板发现。
话不多说,直奔主题:
实现该功能的核心是利用pywin32模块,也在搜索过许多帖子,用的ctypes模块,不够直白啊,今天我们来个简单粗暴。
隆重介绍出厂的第一位API,显示或隐藏窗口函数
win32gui.ShowWindow(hWnd, cmdShow )
第一个参数窗口句柄,第二个参数0是隐藏1是显示
#######################################################################
第二位API也是win32gui家族的,注册热键函数
win32gui.RegisterHotKey(hWnd, id, Modifiers, vk)
参数一窗口句柄,参数二热键id,参数三功能键,参数四虚拟键都是数字类型
为了方便大家,我把参数三的范围贴下:
参数四的太多了,给大家个网址:
https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
######################################################################
第三位API获取信息函数,通过这个函数获得热键是否被按下
win32gui.GetMessage(hwnd, min , max )
第一个参数还是窗口句柄,可见窗口句柄很重要,然而对于我们这个程序来说用处并不大。
第二第三个参数据说是有一定范围的,但是我测试了几种,都达不到效果。下面来看代码吧:
import win32api, win32gui, win32con
from tkinter import ttk
import threading
import time
import sys
def hide():
#第一个参数填0,意味着为当前线程添加热键,第二个99,你也可以用别的数字,自己测试下
#我注册的热键是win+F10
win32gui.RegisterHotKey(0,99,win32con.MOD_WIN, win32con.VK_F10)
flag = True#真真假假实现开关效果
while 1:
time.sleep(1)#避免频繁获取暂停一秒
msg=win32gui.GetMessage(0,0,0)#获得本线程产生的消息,返回值是个列表
#msg-----[1, (0, 786, 99, 7929864, 24627051, (534, 440))]
if msg[1][2]==99:#根据下标和热键id确定按下的是我们注册的热键99
flag = not flag#更改标志
hd = win32gui.FindWindow(0,"躲猫猫")#根据标题找到窗口句柄
win32gui.ShowWindow(hd,flag)#把句柄传给showwindow实现显示隐藏效果
#以下是程序主线程
top=tk.Tk()
top.title("躲猫猫")
xxx=threading.Thread(target=hide)
xxx.setDaemon(1)#设置守护线程,当线程结束,守护线程同时关闭,要不然这个线程会一直运行下去。
xxx.start()
top.mainloop()
细心的朋友可能会发现了,我的热键并没有注册到tk的窗口程序上,另外在函数hide中休眠的1秒最好不要去掉,容易发生找不到窗口句柄的问题,就是窗口还没创建出来,而我已经开始找窗口了。我的热键都是注册在hide这个线程内的,所以后面的隐藏窗口可以随意隐藏其他窗口也行,你可以试试新建一个文本文档,然后把findwindow的第二个参数改成新建文本文档的标题,测试一下。如果你觉得本文对你有所帮助,请给作者点个赞吧,毕竟硬扒win32api挺枯燥的。
看完点个赞,你好我也好!!!!!