Windows 8、64ビットでPythonを使用してデフォルトのコンソールカラーを取得しようとしています:
class CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
_fields_ = [('dwSize', wintypes._COORD),
('dwCursorPosition', wintypes._COORD),
('wAttributes', c_ushort),
('srWindow', wintypes._SMALL_RECT),
('dwMaximumWindowSize', wintypes._COORD)]
...
def __init__(self):
self.stdout_handle = windll.kernel32.GetStdHandle(-11) # STD_OUTPUT_HANDLE
print self.stdout_handle # 28
csbi = CONSOLE_SCREEN_BUFFER_INFO()
print sizeof(csbi) # 22
retval = windll.kernel32.GetConsoleScreenBufferInfo(self.stdout_handle, byref(csbi))
print windll.kernel32.GetLastError()
print csbi.wAttributes, " (%s)" % bin(csbi.wAttributes)
if retval == 0:
formatwinerror() # A helper function
対話型インタープリター (オブジェクトのインポートと作成) を使用すると、最後のエラー コード 6 (無効なハンドル) と属性 0 で Python 2.7.5 を使用すると失敗します。同じコード Python 3.3.2 を実行すると、動作します (エラーコード 0 と属性 0xf (デフォルト)。興味深いことに、Python 2.7.5 を使用し、代わりに次のコードを使用すると、動作します。
import struct
...Same as before...
csbi = create_string_buffer(22)
retval = windll.kernel32.GetConsoleScreenBufferInfo(self.stdout_handle, csbi)
width, height, curx, cury, wattr, left, top, right, bottom, maxx, maxy = struct.unpack("hhhhHhhhhhh", csbi.raw)
print wattr, " (%s)" % bin(wattr)
...Same as before...
追加のデバッグのために、呼び出しのコアを別のスクリプトにコピーし (クラス外の関数内でも試しました)、両方のバージョンのコマンド ラインで完全に実行されるようになりました。ただし、GetStdHandle の呼び出しの前にこの行を追加すると、別のスクリプトは Python 2.7.5 では失敗しますが (ここから)、対話型インタープリターを使用すると失敗します。
windll.kernel32.GetStdHandle.restype = wintypes.HANDLE
Python 3.3.2 の場合、関係なくすべてが機能するようです。私は検索され、読んで、他の Python モジュールを見て、一晩中自分のコードをレビューしていましたが、運がなかったのです...一体何が起こっていて、何が欠けているのでしょうか?