添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
备案 控制台
学习
实践
活动
专区
工具
TVP
写文章
专栏首页 rikka Python 实现窗口保持置顶
0 0

海报分享

Python 实现窗口保持置顶

今天一边看视频一边用 Typora 记笔记的时候发现一个问题, Typora 自带的 保持窗口在最前端 不知何故会失效, 所以我就想用 Python 写一个可以让窗口强制指定的工具, 毕竟在查阅文档的时候还是有些用处的.

使用的模块

  1. win32gui
  2. keyboard
  3. win32con
  4. pyinstaller

使用的函数及其原型

SetWindowPos

WINUSERAPI BOOL WINAPI SetWindowPos(HWND hWnd,HWND hWndInsertAfter,int X,int Y,int cx, int cy, UINT uFlags);

用于设置窗口的 Z 序号

参数解释如下:

  • hwnd : 被修改的窗口的句柄
  • hWndlnsertAfter : 用于标识 Z 顺序, 可设为以下值:
    • HWND_BOTTOM : 值为 1, 置底
    • HWND_NOTOPMOST : 值为 -2, 置于非置顶窗口之上
    • HWND_TOP : 值为 0, 置顶
    • HWND_TOPMOST : 值为 -1, 置顶 (在 HWND_TOP 之上)
  • X , Y , cx , cy 确定了新窗口的位置和宽高
  • uFlags : 窗口尺寸和定位的标识, 部分值如下:
    • SWP_NOOWNERZORDER : 不改变 Z 序中所有者窗口的位置
    • SWP_NOSIZE : 不改变窗口大小
    • SWP_NOMOVE : 不移动窗口

GetForegroundWindow

用于获取当前激活的窗口 (鼠标焦点所在窗口)的句柄

HWND GetForegroundWindow(void);

keyboard.addhotkey keyboard.wait

keyboard.add_hotkey('alt + t', fun)
while true:
	keyboard.wait()

add_hotkey 可以设置热键和检测到热键按下后执行的方法, wait 是阻塞方法, 便于检测组合键

源码

import win32gui
import keyboard
import win32con
import atexit
class totop:
    flag = False
    hw = ''
    def force_focus(self, hwnd):
        win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST, 0, 0, 0, 0,
                              win32con.SWP_NOOWNERZORDER | win32con.SWP_NOSIZE | win32con.SWP_NOMOVE)
        print("置顶", hwnd, win32gui.GetWindowText(hwnd))
    def cancel_focus(self, hwnd):
        win32gui.SetWindowPos(hwnd, win32con.HWND_NOTOPMOST, 0, 0, 0, 0,
                              win32con.SWP_SHOWWINDOW | win32con.SWP_NOSIZE | win32con.SWP_NOMOVE)
        print("取消置顶", hwnd, win32gui.GetWindowText(hwnd))
    def handler(self, op, hwnd):
        op(hwnd)
    def get_key(self):
        def fun():
            if not self.flag and win32gui.GetForegroundWindow() != '':
                self.hd = win32gui.GetForegroundWindow()
                self.handler(self.force_focus, self.hd)
                self.flag = True
            elif self.flag and win32gui.GetForegroundWindow() != '':
                if self.hd == win32gui.GetForegroundWindow():
                    self.handler(self.cancel_focus, win32gui.GetForegroundWindow())
                    self.flag = False
        keyboard.add_hotkey('alt+t', fun)
        while True:
            keyboard.wait()
if __name__ == '__main__':
    zd = totop()
    zd.get_key()
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客: https://www.bilibilianime.com/ 复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。