前言
屏幕键盘,放大镜等这些辅助类程序在使用时并不会抢夺其他窗口的焦点,比如说屏幕键盘的窗口即使点击了也不会获取焦点,但依然能点击按键输入文字。在 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 中,就无法将内容输入到外部窗口。