.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製の日本語キーボード
です.
他に必要な情報がありましたら丁寧にお答えいたします.
No.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に「おんぶにだっこ」するしかないのです。
返事が極端に遅くなり,申し訳ありませんでした.
ご丁寧にIMEの挙動を説明していただき,ありがとうございました.
なかなか思うようにシンプルにはいかないのですね.
今後,またキーボードの挙動を調べるプログラムを(やっぱりC#で)作ろうと思っているので,
そのときの参考にさせていただきます.
数少ない回答の中,有益な情報を教えていただき,ありがとうございました!
No.1
- 回答日時:
>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%正しいとは限りません。
詳細かつ適切な回答ありがとうございます.
「グローバルフックキーボード」のソースを見てみたところ,
キーコードを触っている箇所はおそらくなかったように思いますので,
私の責任かもしれません..
C言語のime.hは,.NETのC#に存在するかはわかりませんが,
WindowsメッセージのwParamで押されたキーは確認できそうなので,
確認してみます.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- iOS これは日本語入力の大発明ですか? 7 2022/12/21 07:17
- マウス・キーボード キーボード(半角/全角 漢字)のキーから 入力モード 2 2022/11/23 09:58
- マウス・キーボード パソコンの外付けキーボードについて ノートパソコンて外付けキーボードを使用すると、入力うまく行きませ 4 2023/01/04 23:02
- マウス・キーボード 不良表示キー(キーボード) 3 2022/04/27 10:53
- その他(悩み相談・人生相談) キーボードに、全角半角のキーがありません。 どこで切り替えたら良いのでしょうか? 画面をいちいち触っ 1 2022/06/28 22:32
- マウス・キーボード キーボードについて。 3 2022/04/01 21:33
- Excel(エクセル) 全角文字「ヴ」の半角文字「ヴ」への変換方法について 3 2022/11/05 12:07
- Word(ワード) Windows11キーボードの調子が悪いので治し方を教えてください。 【症状】 1つ目 キーボードの 5 2022/07/03 14:51
- フリーソフト 日本語の入力をすべて記録する 1 2022/07/07 12:52
- Excel(エクセル) スラッシュ記号(/)を入力できないッ! 2 2022/05/22 11:45
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
英数字のみ全角から半角に変換
-
VBAの文字列の中に”(全角のダブ...
-
Accessで日付や数値を全角で表...
-
エクセルの検索が正しくできな...
-
Accessのテキストボックスの入...
-
小説の点々は……と繋がらなくて...
-
VBA 文字に半角が含まれて...
-
「 _ _ 」の正式名称を...
-
住宅にカナを入力する際に丁目...
-
プログラミングでは、半角括弧...
-
Accessでのグループ化で全角・...
-
[Excel VBA] ODBCによる外部デ...
-
コマンドプロンプト 全角を含ん...
-
IEからEdgeへの移行に伴うIMEの...
-
Excel VBAでオートシェイプ内の...
-
エクセルでの”々”の扱い
-
Excelの中に全角ひらがな、漢字...
-
VBScriptの正規表現で半角スペ...
-
全角文字だけ抜き出したい
-
エクセルにMicrosoft Barcode C...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
英数字のみ全角から半角に変換
-
住宅にカナを入力する際に丁目...
-
全角英数字の必要性が理解できない
-
Excel関数またはVBAでの質問に...
-
エクセルにMicrosoft Barcode C...
-
IEからEdgeへの移行に伴うIMEの...
-
VBA 文字に半角が含まれて...
-
COBOL・全角判定
-
プログラミングでは、半角括弧...
-
word差し込み印刷 半角カタカ...
-
メモ帳の段落の揃え方
-
よくアカウント等に使われる 半...
-
Accessのテキストボックスの入...
-
ダブルコーテーションの置換
-
エクセルでの”々”の扱い
-
小説の点々は……と繋がらなくて...
-
大文字と全角文字は同じ意味で...
-
[VBScript]バイト長の判定
-
封筒の宛先で縦書きの書き方
-
VBで、String型のデータが、...
おすすめ情報