プロが教えるわが家の防犯対策術!

.NETで,キーボード入力で,ユーザの全角/半角入力状態を識別して処理するために,
・(1)キーの全角/半角を押したか(瞬間)
・(2)キーの全角/半角を押している最中か(押しっぱなし状態)
・(3)キーの全角モードか,半角モードか(NumLockのように,トグルがON)
の3種類を識別したいです.
(真ん中は,あまり区別する必要は無いです.)

そこで,ぬるり様のグローバルフックキーボード
http://hongliang.seesaa.net/article/7539988.html
を使って,
「全角/半角」キーを調べているのですが,
実際にキーボードの上記キーを押すと,
Keys列挙体の名前が
「ControlKey, OemBackslash」 ⇔ 「D4, Oemtilde」
の(3)トグル状態が交互に切り替わり,
望んだ「全角/半角」キー認識ができません.

MSDNライブラリ
http://msdn.microsoft.com/ja-jp/library/system.w …

を見ると,
・D4       数字1キー
・OemBackslashOEM バックスラッシュ キー
・OemTildeOEM チルダ キー
をなっていますが,上記キーを押していないのにこれらのKeysが取得さrてしまいます.
なお,「ControlKey」や「ControlKey, ***」という名前は存在しないように思います.

また,
・KanaModeIME かなモード キー
・KanjiModeIME 漢字モード キー
などはあるのですが,
欲しい,全角/半角キーは見当たりません.

Keys列挙体で日本語キーボードの「全角/半角」キーを管理するには,
どのようにしたらよいのでしょうか?
また,これらの余分なキーのトグルは,なぜ起こるかわかりましたら,お教えいただけると幸いです.

ちなみに,環境は
OS: WindowXP,キーボード: DELL製の日本語キーボード
です.
他に必要な情報がありましたら丁寧にお答えいたします.

A 回答 (2件)

書き忘れましたが、インストールされているIMEにより、全角/半角押下時の挙動が異なります。



IME98がインストールされていると、全角/半角キーにより発生するWM_KEYDOWNのwParamは、
・単体で押した場合、VK_DBE_SBCSCHARとVK_DBE_DBCSCHARが交互に押される。
・Altキーと同時に押した場合、VK_KANJIが押される。
のようになります。

特殊キーを一緒に押したかどうかで、キーコードがコロコロ変化するので、かなり厄介です。

しかも、この挙動は「IME98だけ」と思ってよく、IME2000や、ATOKでは、どういう挙動になるか「やってみないと判らない」です。

この「やってみないと判らない部分」は「インストールされたIMEシステム」が違いを吸収してくれます。そのおかげで「アプリから見た時、IMEが何になってても、すべて同じ処理で済ます事が可能」なのです。

逆に言えば「IMEを介して処理しないと、同じ処理で済ます事が出来ない」ことを意味します。

IMEをバイパスして処理しようと思うなら「どんなIMEがインストールされているか独自に判定し、入っているIMEごとに処理を変える」必要があるでしょう。じゃないと、IMEが誤動作します。

IMEが処理する特殊キーは、IMEに「おんぶにだっこ」するしかないのです。
    • good
    • 0
この回答へのお礼

返事が極端に遅くなり,申し訳ありませんでした.
ご丁寧にIMEの挙動を説明していただき,ありがとうございました.

なかなか思うようにシンプルにはいかないのですね.
今後,またキーボードの挙動を調べるプログラムを(やっぱりC#で)作ろうと思っているので,
そのときの参考にさせていただきます.
数少ない回答の中,有益な情報を教えていただき,ありがとうございました!

お礼日時:2010/01/16 16:24

>Keys列挙体で日本語キーボードの「全角/半角」キーを管理するには,


>どのようにしたらよいのでしょうか?
できません。

このキーを制御するには、システムにインストールされているIMEに問い合わせ処理する必要があります。

>また,これらの余分なキーのトグルは,なぜ起こるかわかりましたら,お教えいただけると幸いです.
「グローバルフックキーボード」とかいうソフトのバグでしょう。

「全角/半角」のバーチャルキーコード(Keys列挙体に相当するコード)は、Windowsの標準キーコードではなく、IMEキーコードになっています。

C言語では、ime.hに
#define VK_DBE_SBCSCHAR 0x0f3 //「全角/半角」押下時の「半角⇒全角」
#define VK_DBE_DBCSCHAR 0x0f4 //「全角/半角」押下時の「全角⇒半角」
と定義されています。

他のバーチャルキーは、winuser.hに
#define VK_KANJI 0x19 //「Alt+全角/半角」押下時のキー
などと定義されています。

もし「グローバルフックキーボード」とかいうソフトが、winuser.hにあるキーしか表示出来ないのなら、ime.hにあるキーを押した瞬間「予期せぬ、存在しないキーが押されてしまいデタラメな表示」をするでしょう。

「全角/半角キーを押下して、WM_KEYDOWNイベントが発生した時、wParamに、つまり、バーチャルキーに、どんな値が入って来るのか?」は、自分でプログラムを書いて確かめるようにしましょう。人が書いたプログラムが100%正しいとは限りません。
    • good
    • 0
この回答へのお礼

詳細かつ適切な回答ありがとうございます.

「グローバルフックキーボード」のソースを見てみたところ,
キーコードを触っている箇所はおそらくなかったように思いますので,
私の責任かもしれません..

C言語のime.hは,.NETのC#に存在するかはわかりませんが,
WindowsメッセージのwParamで押されたキーは確認できそうなので,
確認してみます.

お礼日時:2008/11/21 20:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!