2009-05-29 12 views
2

私は、キーストロークの記録と再生が必要なプログラムに取り組んでいます。メインプロセスはサービスとして実行されるので、キーストロークを記録するための構成プログラムが必要です。別のプロセス(Windows)のキーボードレイアウトを決定する方法は?

システムのデフォルトのキーボードレイアウトが英語で、その時のユーザーのキーボードレイアウトがドイツ語である場合に問題が発生します。ユーザは、コンフィギュレーションインターフェースに 'ü'文字を入力します。これは正式に記録され、保存されます。

ユーザーはメモ帳を実行し、サービスの子によって行われたキーストロークを再生しようとします。入力をSendInputに変換すると、VkKeyScanとなり、このキーボードでその文字を再現する方法はありません(デフォルトのキーボードレイアウトは英語です)。

サービスのキーボードレイアウトと現在のフォアグラウンドアプリケーションを同期することができます。そのため、ユーザーはキーボードで任意の文字を再現できます。 GetKeyboardLayoutは現在のプロセスでのみ動作します。これは32ビットと64ビットの両方で動作するため、メッセージフックは好ましくない。フォアグラウンドウィンドウのキーボードレイアウトを取得するために

答えて

5

GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL)) 

あなたは文字の代わりに、キーストロークを記録しているように聞こえます。再生時にキーストロークを送信する代わりに、SendMessageを使用してキーストロークを生成するのではなく、記録された文字でWM_CHARメッセージを送信できますか?

+0

これはサービスからは機能しません(インタラクティブサービスからは動作しますが、インタラクティブサービスの使用は推奨されず、新しいバージョンのWindowsでは動作しません)。 – jdigital

+0

なぜ私はこれを考えなかったのか分かりません。 @jdigitalは、サービスがユーザーのセッションでワーカープロセスを持っているため、実際に動作します。ありがとう! –

関連する問題