キーボードの状態監視

解決


ハレ  2006-01-14 01:39:01  No: 19614

テキストエディタではないのですが、ステータスバーに
「カナ」カタカナひらがなキー
「CAPS」CapsLockキー
「INS」Insertキー
「NUM」Numlockキー
等の押されている状態を表示しようかと考えています。
このとき、キーボードの状態変更を監視する手段としては、どういったものが適切でしょう?

MDI形式のアプリなので、フォームが多数存在することから、メインフォームの
KeyDownイベントでは役不足ですし、Application.OnMessageで、KEY_DOWN 
のメッセージを全て捕まえるのは、無駄な気もします。

ちなみに、GetKeyState(VK_KANA) で、キーの状態取得しています。


ハレ  2006-01-14 01:54:44  No: 19615

もしかしたら、ステータスバーに表示するということで、ステータスバーの
OnDrawPanelイベントで、その都度GetKeyStateした方がいいのかな?


ハレ  2006-01-14 01:59:21  No: 19616

そういえば、OnDrawPanelでは、キーを押された時に反応できないですね・・・


ママん  2006-01-14 04:10:49  No: 19617

GetKeyState(VK_KANA)できたっけ?
と思って試してみましたが、やっぱりできませんよね?
「CAPS」CapsLockキー
「INS」Insertキー
「NUM」Numlockキー
はお好きなメッセージをキャプチャしてあげてください。
(略)
  private
    OriginalProc:TWndMethod;
    procedure EditSubclassProc(var Msg:TMessage);
(略)
procedure TForm1.EditSubclassProc(var Msg: TMessage);
  procedure drawoutIMEstate;
  begin
      Label1.Caption := 'NumLock : ' + inttostr(GetKeyState(VK_NUMLOCK));
      Label2.Caption := 'Control : ' + inttostr(GetKeyState(VK_CONTROL));
      Label3.Caption := 'INSERT  : ' + inttostr(GetKeyState(VK_INSERT));
      Label4.Caption := 'KANA    : ' + inttostr(GetKeyState(VK_KANA));
  end;
begin
  case Msg.Msg of
    WM_IME_ENDCOMPOSITION:drawoutIMEstate;
    WM_IME_COMPOSITION   :drawoutIMEstate;
    WM_IME_NOTIFY        :drawoutIMEstate;
    WM_IME_CONTROL       :drawoutIMEstate;
    WM_IME_KEYDOWN       :drawoutIMEstate;
    WM_IME_KEYUP         :drawoutIMEstate;
    WM_KEYDOWN           :drawoutIMEstate;
    WM_KEYUP             :drawoutIMEstate;
  end;
  OriginalProc(Msg);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  OriginalProc := Edit1.WindowProc;
  Edit1.WindowProc := EditSubclassProc;
end;


ハレ  2006-01-14 08:31:24  No: 19618

キーの状態っていうより、
CapsLockのOn/off状態
NumLockのOn/off状態
という、現在のキーの設定ですね。
トグルとかと言う表現のほうがいいのでしょうか?

テキストエディタなんかでは、ステータスバーに、「NUM」とか「CAPS」とか「カナ」とか表示して、
現在の状態を表示してくれるものがあるじゃないですか。
キーボード上で言えば、NumLock、CapsLock、ScrollLockのランプみたいなものです。

そんなわけで、せっかくレスいただいたのですが、説明の仕方が悪かったようで、
求める解答ではないようです。
すいませんでした。

引き続き情報募集します。


Mr.XRAY  URL  2006-01-14 09:52:41  No: 19619

>トグルとかと言う表現のほうがいいのでしょうか?

「いいいのでしょうか?」ではなくて,状態をON,OFFに指定できるのをトグル
といいます.
トグル状態は,GetKeyStateで取得した値の第一ビットがフラグとなって
いますので,これで判断します.たとえば[CapsLock]は

 GetKeyState( VK_CAPITAL ) and 1 > 0 then

のように判定します.

[参考URL]
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpwinui/html/_win32_getkeystate.asp


ハレ  2006-01-15 00:20:42  No: 19620

> 「いいいのでしょうか?」ではなくて,状態をON,OFFに指定できるのをトグル
> といいます.
ありがとうございます。
単語知らずで、すいませんでした。

では、そのトグル状態を正しく表示するには、どう監視するのが一番いいのでしょう?
最初の書き込みで「キーの状態取得」と書いていますが、これが「トグル状態の取得」の間違いで、
GetKeyStateで判断できることはわかっています。

> スレッドがメッセージキューからキーメッセージを読み出すたびに
Mr.XRAYさんの参考URLでは、このような書き出しで記載されています。

ということは、Application.OnMessage でキーメッセージを受け取ったときに
状態確認するのが一番なのでしょうか?
それとも、他にいいタイミングがあるのでしょうか?

トグルという表現を知らなかったせいで、意図を伝え切れませんでしたが、
これで最初の質問の意図が伝わったでしょうか?


わからんちん  2006-01-15 01:27:55  No: 19621

http://72.14.203.104/search?q=cache:u70PrDKbl6AJ:dobon.net/vb/dotnet/control/sbdatetimepanel.html+%E3%82%AB%E3%83%8A+CAPS+INS+NUM%E3%80%8DNumlock+get&hl=ja&lr=lang_ja

よくわかりませんが、VB のものがヒットしました。参考になるでしょうか?


Mr.XRAY  URL  2006-01-15 02:08:15  No: 19622

>いうことは、Application.OnMessage でキーメッセージを受け取ったときに
>状態確認するのが一番なのでしょうか?
>それとも、他にいいタイミングがあるのでしょうか?

それは何ともいえません.開発するアプリの仕様で決めていくことになる
でしょう.キーの検出ということに絞れば,キーの操作を捕らえるわけですか
ら,単純に考えば,キーフックでもいいと思います.

[参考URL]
http://homepage2.nifty.com/Mr_XRAY/Halbow/Notes/N006.html


Mr.XRAY  URL  2006-01-15 10:14:51  No: 19623

>それは何ともいえません.開発するアプリの仕様で決めていくことになる

誤解のないように... (^_^);
ある目的の動作を実現するにはいろいろなコーディング方法があると思います.
どの方法がいいかというのは,難しい問題です.でも,正常に動いてナンボ
です.その意味では,ママんさんの方法(サブクラス化)でも構わないと思い
ます.この動作には,この方法でなければいけないというものがあるとした
ら,私の提供しているコンポのコードなんか無茶苦茶です(笑).

方法によっては,微妙に動作が異なる場合があります.これは,実際にコー
ディングして,いろいろ動作させてみて確認するしかありません.
または,ネット上の解説などを参考にするのも一つの手です.


ハレ  2006-01-15 21:49:47  No: 19624

わからんちん さん、Mr.XRAY さん、レスありがとうございます。

わからんちん さん
> よくわかりませんが、VB のものがヒットしました。参考になるでしょうか?
これによると、Application.OnIdleで更新しているようです。
「OnIdleでええんかいな(えせ関西人風)」でつっこんでみましたが、
これでやってみたところ、うまく動作しているようなので、
当面、これで様子を見てみることにします。
何より、ラクだし(^^ゞ

> >それは何ともいえません.開発するアプリの仕様で決めていくことになる

> 誤解のないように... (^_^);
誤解しましt・・・(笑)
「開発するアプリの仕様で決めていくことになる」のは百も承知で、
「一般的にどうしているのか?」という感じでした。
というのも、Application.OnMessage しか思いつかず、「それってあまりにスマートじゃないぞ」と思い、質問したのです。
いくつかの候補があがれば、そこから検証して実装を確定したらいいわけでして。。。

逆に、「どのような手法があるか?」という質問のほうが、答えやすかったということですかね?
いざ質問者にまわると、回答者に理解してもらいやすい質問の仕方も難しい(^^ゞ

ありがとうございました。
これで解決とします。


Mr.XRAY  URL  2006-01-16 02:48:33  No: 19625

>逆に、「どのような手法があるか?」という質問のほうが、答えやすかったということですかね?

いや,これは最初の質問の
>ちなみに、GetKeyState(VK_KANA) で、キーの状態取得しています。
で理解できましたが,他のレスとのやりとりでの関係で...

でも,スレッドの書き込み内容は,他の方にも参考になると思いますので,
良しとして下さい  (^_^;)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加