2017-02-05 21 views
2

私のキーボードには、ギリシャ語と英語の2つのキーボード言語があります。どのようにして現在のキーボード言語を取得できますか? 私のためのトリックを行うことができる有用なライブラリがありますか? 私はpython 3.5.2、Windows 10を使用しています現在のキーボードの言語をPythonで検出する方法

+0

itシステム情報Windows/Linux/Mac。それはあなたが使用するシステム上depeondsすることができます。 – furas

+0

@furas windows! –

+0

おそらく、別のSOの質問への[回答](http://stackoverflow.com/a/3425316/5209610)が役に立ちます(その投稿の両方の回答を参照してください)。 Unix SEサイトでこれに別の良い[回答](http://unix.stackexchange.com/a/295271)があります。 –

答えて

5

​​ライブラリを利用した以下のアプローチが役に立ちます。

# My keyboard is set to the English - United States keyboard 
>>> import ctypes 
# For debugging Windows error codes in the current thread 
>>> user32 = ctypes.WinDLL('user32', use_last_error=True) 
>>> curr_window = user32.GetForegroundWindow() 
>>> thread_id = user32.GetWindowThreadProcessId(curr_window, 0) 
# Made up of 0xAAABBBB, AAA = HKL (handle object) & BBBB = language ID 
>>> klid = user32.GetKeyboardLayout(thread_id) 
67699721 
# Language ID -> low 10 bits, Sub-language ID -> high 6 bits 
# Extract language ID from KLID 
>>> lid = klid & (2**16 - 1) 
# Convert language ID from decimal to hexadecimal 
>>> lid_hex = hex(lid) 
'0x409' 

# I switched my keyboard to the Russian keyboard 
>>> curr_window = user32.GetForegroundWindow() 
>>> thread_id = user32.GetWindowThreadProcessId(curr_window, 0) 
>>> klid = user32.GetKeyboardLayout(thread_id) 
68748313 
# Extract language ID from KLID 
>>> lid = klid & (2**16 - 1) 
# Convert language ID from decimal to hexadecimal 
>>> lid_hex = hex(lid) 
'0x419' 

あなたはギリシャ語(0x408)と同じ手順、またはあなたが検出したいのですが、他の言語に従うことができます。あなたが興味があれば、lid_hexが入力言語で与えられる可能性のあるすべての16進値のうち、here is a plain-text listhere is Microsoft's listです。

LCIDはthis formatに保存されています(私のコードのコメントに記載されています)。

キーボードで言語を切り替えるたびに、GetKeyboardLayout(thread_id)に電話していることを確認してください。

EDIT:コメント欄で述べたように@furas

、これはシステムに依存あります。 Windows 10以外のOSにコードを移植する場合(LCIDがそれ以降変更された場合はWindowsの以前のバージョンであっても)、この方法は期待どおりに機能しません。

EDIT 2:klid

私の最初の説明は正しくありませんでしたが、@のeryksunのコメントのおかげで、私はそれを修正しました。

+0

'user32 = ctypes.WinDLL( 'user32'、use_last_error = True)'に切り替えます。また、[GetKeyboardLayout'](https://msdn.microsoft.com/en-us/library/ms646296)の 'HKL'結果は、低ワード(16ビット)の言語識別子を持っています。 'klid = hkl&(2 ** 16-1)'。言語識別子は、下位10ビットの主言語IDと、上位6ビットの副言語IDとからなる。 0x409の言語IDは9( 'LANG_ENGLISH')、サブ言語IDは1(' SUBLANG_ENGLISH_US')です。 – eryksun

+0

汎用性のためにここに 'use_last_error'が追加されました。それは、関数が呼び出されてから失敗したときにエラーが発生するまでの間にスレッドの最終エラー値を変更する場合に備えて、スレッドの最後のエラー値を保護します。エラー値は 'ctypes.get_last_error()'として利用でき、 'GetLastError'を直接呼び出すよりも信頼性が高いです。 'WinDLL'に切り替える主な目的はあなたのモジュールを他のモジュールから分離することです。 'windll'は関数ポインタをキャッシュするライブラリをキャッシュします。これは、少なくとも1つのモジュールが関数のプロトタイプを、別のモジュールが期待するものとは異なって定義するとき、つまり' windll'が悪い設計であるときに競合を引き起こします。 – eryksun

+0

あなたの 'klid'の説明は間違っています。 0x4090409は0xAAABBBBではなく、言語IDは0xBBBB、サブ言語IDは0xAAAです。言語IDは、言語IDがこのワードの下位10ビットであり、サブ言語IDがこのワードの上位6ビットである低ワード(16ビットまたは4桁の16進数)、すなわち0xBBBBである。 – eryksun

関連する問題