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

如何在Python中检测Windows菜单的打开与关闭状态?

检测Windows菜单状态的可靠方法

方法一:枚举顶层窗口检测菜单窗口

系统弹出的各类菜单(包括开始菜单、右键菜单、应用程序菜单)对应的窗口类名为#32768,通过枚举所有顶层窗口,检查是否存在该类名的窗口即可判断菜单是否打开。

示例代码(依赖pywin32库):

import win32gui

def is_menu_open():
    def enum_callback(hwnd, window_list):
        class_name = win32gui.GetClassName(hwnd)
        if class_name == "#32768":
            window_list.append(hwnd)
        return True
    
    target_windows = []
    win32gui.EnumWindows(enum_callback, target_windows)
    return len(target_windows) > 0

# 调用示例
print("菜单已打开" if is_menu_open() else "菜单已关闭")

方法二:监听系统菜单事件(推荐)

通过SetWinEventHook监听系统级的菜单弹出/关闭事件,这种方式是事件驱动型,能实时捕获状态变化,准确性和效率远高于按键检测或轮询。

示例代码:

import win32con
from ctypes import windll, CFUNCTYPE, c_int, c_void_p
import win32gui

# 定义回调函数类型
WinEventProc = CFUNCTYPE(None, c_int, c_int, c_void_p, c_void_p, c_void_p, c_int, c_int)

def menu_event_handler(event, hwnd, id_obj, id_child, thread_id, event_time):
    if event == win32con.EVENT_SYSTEM_MENUPOPUPSTART:
        print("菜单已打开")
    elif event == win32con.EVENT_SYSTEM_MENUPOPUPEND:
        print("菜单已关闭")

def setup_menu_listener():
    event_proc = WinEventProc(menu_event_handler)
    hook = windll.user32.SetWinEventHook(
        win32con.EVENT_SYSTEM_MENUPOPUPSTART,
        win32con.EVENT_SYSTEM_MENUPOPUPEND,
        0,
        event_proc,
        0,
        0,
        win32con.WINEVENT_OUTOFCONTEXT | win32con.WINEVENT_SKIPOWNPROCESS
    )
    return hook, event_proc

if __name__ == "__main__":
    hook, proc = setup_menu_listener()
    print("正在监听菜单状态变化,按Ctrl+C退出")
    try:
        win32gui.PumpMessages()
    except KeyboardInterrupt:
        windll.user32.UnhookWinEvent(hook)
        print("已停止监听")

补充说明

  • 方法一适合简单的轮询场景,实现成本低,但无法实时响应状态变化,需定期调用检查。
  • 方法二能精准捕获菜单的打开/关闭动作,完全避免按键检测的局限性,是优先推荐的方案。
  • 需提前安装依赖库:pip install pywin32

内容的提问来源于stack exchange,提问作者Mr_Wamsy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 03:12:20