You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python(Windows10/11)中阻止F10选中菜单栏的解决方案

解决Windows下Python监听F10按键时程序冻结的问题

你遇到的问题是Windows系统会优先处理F10按键(激活程序菜单栏),导致Python的按键监听器被抢占,程序暂时冻结。以下是几个可行的解决办法:

方法1:使用keyboard.add_hotkey并启用按键抑制

改用keyboard库的add_hotkey方法,通过suppress=True参数阻止系统接收F10按键事件,这样Windows就不会触发菜单栏激活行为,你的代码可以直接处理按键:

import keyboard

# 定义F10对应的处理逻辑
def handle_f10():
    btemp = berth[1][0:2]
    if btemp != "2H":
        ntemp = nextcode[6] + 100
        ntemp = str(ntemp)
        i = 0
        while i < 6:
            if chstack[i][0:2] == "2H":
                ntemp = chstack[i][-2:]
                j = i
                while j < 5:
                    chstack[j] = chstack[j+1]
                    j += 1
                chstack[5] = "    "
                i = 7
            i += 1
        ntemp = "2H" + ntemp[-2:]
        if i == 6:
            nextcode[6] += 1
            if nextcode[6] > 99:
                nextcode[6] = 1
        berth[1] = ntemp

# 注册F10热键,suppress=True阻止系统处理该按键
keyboard.add_hotkey('f10', handle_f10, suppress=True)

# 保持程序运行(根据你的程序逻辑调整,比如替换为现有主循环)
keyboard.wait()

方法2:使用Windows低级键盘钩子拦截事件

通过pywin32库设置低级键盘钩子,在系统处理F10按键前就拦截并处理,彻底避免系统响应:

首先安装pywin32:

pip install pywin32

然后使用以下代码:

import win32api
import win32con
import win32gui

def handle_f10():
    # 放入你的F10处理逻辑,内容同上述handle_f10函数
    btemp = berth[1][0:2]
    if btemp != "2H":
        ntemp = nextcode[6] + 100
        ntemp = str(ntemp)
        i = 0
        while i < 6:
            if chstack[i][0:2] == "2H":
                ntemp = chstack[i][-2:]
                j = i
                while j < 5:
                    chstack[j] = chstack[j+1]
                    j += 1
                chstack[5] = "    "
                i = 7
            i += 1
        ntemp = "2H" + ntemp[-2:]
        if i == 6:
            nextcode[6] += 1
            if nextcode[6] > 99:
                nextcode[6] = 1
        berth[1] = ntemp

def keyboard_hook(nCode, wParam, lParam):
    if nCode >= 0:
        # 检测是否是F10按键
        if lParam[0] == win32con.VK_F10:
            # 仅在按键释放时处理(和你之前的逻辑一致)
            if wParam == win32con.WM_KEYUP:
                handle_f10()
            # 返回1表示拦截该消息,不让系统继续处理
            return 1
    # 传递其他消息给系统
    return win32gui.CallNextHookEx(hook, nCode, wParam, lParam)

# 设置全局低级键盘钩子
hook = win32gui.SetWindowsHookEx(win32con.WH_KEYBOARD_LL, keyboard_hook, win32api.GetModuleHandle(None), 0)

# 消息循环,保持程序运行
while True:
    win32gui.PumpWaitingMessages()

方法3:禁用程序窗口的菜单栏(如果有GUI)

如果你的程序带有GUI窗口(比如Tkinter、PyQt等),可以直接移除窗口的菜单栏,这样Windows就没有可激活的菜单栏,F10自然不会触发系统行为。以Tkinter为例:

import tkinter as tk

root = tk.Tk()
# 不创建菜单栏,或者销毁已有的菜单栏
root.config(menu='')
# 你的程序逻辑...
root.mainloop()

这些方法都可以解决F10按键导致的程序冻结问题,优先推荐方法1,因为它基于你现用的keyboard库,改动最小。

内容的提问来源于stack exchange,提问作者John A - Essex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:05:14