Python 中 GUI 程序通过设置 WS_EX_NOACTIVATE 实现窗口点击后不激活也不获取焦点

技术 · 2024-12-04 · 246 人浏览

前言

屏幕键盘,放大镜等这些辅助类程序在使用时并不会抢夺其他窗口的焦点,比如说屏幕键盘的窗口即使点击了也不会获取焦点,但依然能点击按键输入文字。在 Windows 中,可通过为窗口设置 WS_EX_NOACTIVATE 位来实现。

代码

首先通过 GetWindowLongW 获取窗口的样式,再通过 SetWindowLongW 为窗口添加上 WS_EX_NOACTIVATE 位。
窗口句柄(hwnd)在 wxPython 中通过窗体的 GetHandle() 方法获取,PyQt 中则通过窗体的 winId() 方法获取。

import ctypes

WS_EX_NOACTIVATE = 0x08000000
GWL_EXSTYLE = -20

# wxPython
# hwnd = self.GetHandle()

# PyQT
hwnd = self.winId()

current_style = ctypes.windll.user32.GetWindowLongW(hwnd, GWL_EXSTYLE)
ctypes.windll.user32.SetWindowLongW(hwnd, GWL_EXSTYLE, current_style | WS_EX_NOACTIVATE)

如图所示,三个按钮都是 PySide6 的 QWidget 窗口,设置 WS_EX_NOACTIVATE 位后,点击按钮并不会使记事本失去输入焦点,实现了和屏幕键盘一样的点击输入文字的效果。而在没有设置 WS_EX_NOACTIVATE 位的情况下,焦点自动转移到了 QWidget 中,就无法将内容输入到外部窗口。

pAosNWD.png

Python
Theme Jasmine by Kent Liao