Windows + Python:为什么第一个打开的窗口没有显示为活动状态?

oll*_*g23 5 python

我发现在Python Windows命令行提示下使用python脚本有一个非常奇怪的问题,为了重现这个问题,你可以简单地执行以下步骤:

  1. 启动Python命令行提示符(这通常是打开开始菜单 - > Python 2.7-> Python(命令行).
  2. 键入以下文本,然后按Enter键.

    import ctypes
    
    Run Code Online (Sandbox Code Playgroud)
  3. 键入以下文本,然后按Enter键.

    ctypes.windll.user32.MessageBoxA(0, "Your text", "Your title", 1)
    
    Run Code Online (Sandbox Code Playgroud)
  4. 您将看到一个消息框已打开,但此消息框窗口未激活.
  5. 使用鼠标单击任务栏中消息框的图标以激活消息框
  6. 关闭消息框
  7. 在Python提示shell中再次键入文本

    ctypes.windll.user32.MessageBoxA(0, "Your text", "Your title", 1)
    
    Run Code Online (Sandbox Code Playgroud)
  8. 现在,消息框显示已激活(预期行为)

所以,我的问题是,为什么第一个消息框(窗口)没有显示为活动状态?我最初在GDB命令行下运行Python漂亮的打印机时发现这个问题,因为我想使用一些python漂亮的打印机来查看数据,比如调试c ++程序时这个GDB cv :: Mat python对象问题,我需要在我输入plot命令后立即显示OpenCV Image窗口.

但后来我发现这是一个与Python本身有关的问题.

Kob*_*ohn 4

我意识到最初的答案实际上并没有像第一次尝试那样激活窗口。然而,这个答案在第一次尝试时对我来说确实有效。使用 MB_SETMODAL 标志 (0x00001000) 作为解决方法:

set_modal_flag = 0x00001000
ctypes.windll.user32.MessageBoxA(0, "Your text", "Your title", set_modal_flag)
Run Code Online (Sandbox Code Playgroud)

(*编辑 - 以前的代码可能“应该”工作但没有。)

你能试试这个吗?该0x10选项是我在评论中提到的MB_SETFOREGROUNDWINDOW选项。它能达到你想要的效果吗?

set_foreground_flag = 0x00010000
ctypes.windll.user32.MessageBoxA(0, "Your text", "Your title", set_foreground_flag)
Run Code Online (Sandbox Code Playgroud)

至于“为什么”它不起作用,上面链接的答案也解释了这一点。我过去在激活窗口时也遇到了麻烦,并直接使用 SetForegroundWindow() ,但在异步窗口上我可以直接调用它。