« [勉強会@名古屋] 2月6日 わんくま同盟 名古屋勉強会 #11 | トップページ | PSExpect - PowerShell 用ユニット テスト ライブラリー »

2010年1月 7日 (木)

[.NET] SendKeys はキーボード配列に依存する

.NET Framework の SendKeys って使ったこと無いんですよ。 キーストロークを送るのって、 タイミング依存だし、 ユーザー操作によって失敗する (プログラムからフォーカス当てて、 キーストロークを送るまでの瞬間に、 フォアグラウンドを切り替えられてしまったら…  f(^^; ) しで、 すごく使いにくい。 おまけに、 MSDN ライブラリには、 こんなこと書いてあるし。

.NET Framework クラス ライブラリ
SendKeys クラス

注意 :
国際対応のアプリケーションでは、 Send の使用は避けてください。 使用されるキーボードの種類が多岐にわたるため、 予期しない結果が発生する可能性があります。

で。 実際にはこんなことになる、 という例を MS Connect で初めて知りました。

MS Connect FeedbackID=521777
SendKeys でカレット (^) の送信ができない

Sendkeys.SendWait("{^}");
では「^」が送信されるはずだが、実際には「&」が送信される。

投稿者: Azulean、投稿日時: 2010/01/06 8:56
この不具合は英語キーボードでは起きません。日本語キーボード(109キーなど)では確実に起きます。
(他の言語のキーボードもレイアウトによっては発生する可能性があります)

Shift + 6 は日本語109では & になり、英語キーボードでは ^ になるようです。
SendKeys クラスの keywords 配列では "^" に対して (int)(Keys.D6 | Keys.Shift) を割り当てており、キーボードレイアウトの影響を受けています。

なるほどねぇ。 「"^" のキーストロークを送れ!」 って命令に対して、 .NET Framework は英語キーボードで考えて Shift + 6 を送信する。 受信したウィンドウのメッセージループでは、 日本語キーボードだから Shift + 6 は "&" だと解釈する。 ってことね。

たしかに、 Win32 API の keybd_event() や SendInput() で使う Virtual-Key Codes には、 シフト押しながら打つ記号は定義されてないもんなぁ。

|

« [勉強会@名古屋] 2月6日 わんくま同盟 名古屋勉強会 #11 | トップページ | PSExpect - PowerShell 用ユニット テスト ライブラリー »

プログラミング」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: [.NET] SendKeys はキーボード配列に依存する:

« [勉強会@名古屋] 2月6日 わんくま同盟 名古屋勉強会 #11 | トップページ | PSExpect - PowerShell 用ユニット テスト ライブラリー »