2013-12-16 3 views
4

я обнаружил очень странную проблему об использовании сценариев питона под Python Windows, командной строки, чтобы воспроизвести эту проблему, вы можете просто сделать эти шаги:Windows + Python: Почему первое открытое окно не отображается активно?

  1. запуска команды Python строка, (это, как правило, в хит Start Меню-> Python 2,7 мкм> Python (командная строка).
  2. типа следующий текст и нажмите клавишу ввода.

    import ctypes 
    
  3. введите следующий текст, и нажмите клавишу ввода.

    ctypes.windll.user32.MessageBoxA(0, "Your text", "Your title", 1) 
    
  4. Откроется окно сообщения, но окно этого окна сообщений не активировано.
  5. Используйте мышь, чтобы нажать на иконку в окне сообщения в панели задач, чтобы активировать окно сообщения
  6. закрыть окно сообщения
  7. типа текст снова в Python промпт

    ctypes.windll.user32.MessageBoxA(0, "Your text", "Your title", 1) 
    
  8. Теперь окно сообщения отображается активированным (ожидаемое поведение)

Итак, мой вопрос в том, почему первое окно сообщения (окна) не отображается активно? Первоначально я нахожу эту проблему, когда я запускаю Python довольно принтер в командной строке GDB, потому что я хочу использовать довольно красивый принтер python для визуализации данных, например, это GDB cv::Mat python object issue when debugging a c++ program. Мне нужно показать окно OpenCV Image сразу после ввода команды plot ,

Но позже я обнаружил, что это проблема, связанная с самим Python.

+1

У меня нет времени, чтобы выяснить, как это сделать, но вы проверили [ссылку] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms645505 (v = vs.85) .aspx) для MessageBoxA? В нем говорится, что есть опция «MB_SETFOREGROUND», которая явно устанавливает диалоговое окно для активного. Если это не модально, вы можете сделать это непосредственно с помощью 'ctypes.windll.user32.SetForegroundWindow (hwnd)'. Я думаю, что 'MB_SETFOREGROUND' делает именно это внутренне. [Эта страница] (http://python.net/crew/theller/ctypes/reference.html) может помочь выяснить, как установить этот параметр. – KobeJohn

ответ

3

Я понял, что первоначальный ответ фактически не активировал окно, как это было с первой попытки. Тем не менее, this SO answer действительно работает для меня с первой попытки. Используйте флаг MB_SETMODAL (0x00001000) в качестве обходного пути:

set_modal_flag = 0x00001000 
ctypes.windll.user32.MessageBoxA(0, "Your text", "Your title", set_modal_flag) 

(* - редактировать предыдущий код, который может быть "должен" работать, но не.)

Можете ли вы попробовать это? Опция 0x10 - это опция MB_SETFOREGROUNDWINDOW, о которой я упоминал в комментариях. Он делает то, что вы хотите?

set_foreground_flag = 0x00010000 
ctypes.windll.user32.MessageBoxA(0, "Your text", "Your title", set_foreground_flag) 

Что касается «почему», это не работает, ответ, приведенный выше, также объясняет это. Мне также не удалось активировать окно в прошлом и использовать SetForegroundWindow() напрямую, но в асинхронных окнах, где я мог бы назвать это напрямую.

+0

Привет, Кобеджон, я просто попробую метод с опцией: MB_SETFOREGROUND (0x00010000L), он действительно работает, спасибо! Как вы сказали, оставшийся вопрос заключается в том, что если этот параметр не используется, почему во второй раз я запускаю команду ctypes.windll.user32.MessageBoxA (0, «Your text», «Your title», 1), окно будет Показать активные? – ollydbg23

Смежные вопросы