如何让Tkinter应用显示在Windows触摸键盘之上?
如何让Tkinter应用显示在Windows触摸键盘之上?
这个问题我之前也碰见过,Windows的触摸键盘确实有点“霸道”,默认会压过普通的置顶窗口。咱们可以从这几个方向尝试解决:
- 强制重置自身窗口的置顶优先级
你之前尝试修改触摸键盘的置顶属性,但它可能会在后台自动恢复状态。不如直接把自己的窗口强行设为最高层级,这样更可靠。在你的代码里,当检测到触摸键盘出现时,执行这段代码:
import win32gui import win32con # 这里的hwnd是你已经获取到的自己应用的窗口句柄 win32gui.SetWindowPos( hwnd, win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE | win32con.SWP_NOSIZE )
这段代码会把你的窗口固定在所有非系统级窗口的最顶层,能有效压过触摸键盘。
- 实时监听触摸键盘状态,动态调整
触摸键盘可能会在用户操作时突然弹出,咱们可以开一个后台线程实时检测它的存在,一旦发现就立刻重置自己窗口的置顶状态:
import threading import time def monitor_touch_keyboard(): while True: # 查找触摸键盘的窗口 touch_keyboard_hwnd = win32gui.FindWindow(None, "Microsoft Text Input Application") if touch_keyboard_hwnd: # 触摸键盘已弹出,重置自身窗口置顶 win32gui.SetWindowPos( hwnd, win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE | win32con.SWP_NOSIZE ) time.sleep(0.5) # 启动后台监听线程,设置为守护线程避免影响程序退出 threading.Thread(target=monitor_touch_keyboard, daemon=True).start()
把这段代码加到你的myapp.mainloop()之前,就能实时响应触摸键盘的弹出了。
- 检查窗口扩展样式是否冲突
你当前设置了WS_EX_TRANSPARENT透明样式,虽然它不影响置顶,但如果你的窗口不需要透明交互,可以尝试暂时去掉这个样式,看看是否能解决层级问题。如果需要保留透明,那可以忽略这个建议。
另外补充一点:Windows的触摸键盘属于系统级窗口,偶尔可能会出现HWND_TOPMOST压不住的情况,这时候可以尝试把窗口的Z顺序设为HWND_TOP(注意这不是永久置顶,只是临时放到顶部),结合监听逻辑反复执行,也能达到效果。
备注:内容来源于stack exchange,提问作者Kenta Kobayashi
相关产品推荐
相关产品推荐

