#はじめに
コマンドプロンプトなどコンソールウィンドウをpythonの標準出力として使う場合、 簡易編集モード(QuickEdit)は便利ですが、 処理の実行中に標準出力を使う場合などには意図しない中断を招いてしまいます。
もちろんコンソール画面を右クリックすればプロパティからの変更はできるのですが、自分以外の人間の利用を想定する場合にはコードで設定できた方がうれしいです。
#簡易編集モードを無効化するスクリプト
import ctypes
kernel32 = ctypes.windll.kernel32
mode=0xFDB7 #簡易編集モードとENABLE_WINDOW_INPUT と ENABLE_VIRTUAL_TERMINAL_INPUT をOFFに
kernel32.SetConsoleMode(kernel32.GetStdHandle(-10), mode)
これだけです。
(注) コンソールウィンドウが出てからこの処理が実行されるまでのわずかな時間は簡易編集モードが有効になっています。
以下を参考にしました
How to enable Windows console QuickEdit Mode from python?
GetStdHandle 関数
SetConsoleMode 関数
自分の理解できた範囲で簡単に説明すると、
-
ctypesはC/C++のライブラリを呼んできてくれるらしい
-
GetStdHandle(-10)の引数は-10だと標準入力, -11だと標準出力のハンドル?をとってきてくれるらしい
-
SetConsoleModeでコンソールウィンドウの設定を変更できる。設定は16ビットで簡易編集モード(QuickEdit)の設定は0x0040の部分
-
上に貼った記事によるとコンソールウィンドウの設定のうちデフォルトでOFFなのがENABLE_WINDOW_INPUT(0x0008)とENABLE_VIRTUAL_TERMINAL_INPUT(0x0200)なのでそこもOFFにすると0xFDB7(2進数なら0b1111110110110111)になる
本当はGetStdHandleで現在の状態を取得して簡易編集モードだけを無効にしたかったのですが、 byrefの扱いがよく分からず断念しました。