テキストエディタではないのですが、ステータスバーに
「カナ」カタカナひらがなキー
「CAPS」CapsLockキー
「INS」Insertキー
「NUM」Numlockキー
等の押されている状態を表示しようかと考えています。
このとき、キーボードの状態変更を監視する手段としては、どういったものが適切でしょう?
MDI形式のアプリなので、フォームが多数存在することから、メインフォームの
KeyDownイベントでは役不足ですし、Application.OnMessageで、KEY_DOWN
のメッセージを全て捕まえるのは、無駄な気もします。
ちなみに、GetKeyState(VK_KANA) で、キーの状態取得しています。
もしかしたら、ステータスバーに表示するということで、ステータスバーの
OnDrawPanelイベントで、その都度GetKeyStateした方がいいのかな?
そういえば、OnDrawPanelでは、キーを押された時に反応できないですね・・・
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;
キーの状態っていうより、
CapsLockのOn/off状態
NumLockのOn/off状態
という、現在のキーの設定ですね。
トグルとかと言う表現のほうがいいのでしょうか?
テキストエディタなんかでは、ステータスバーに、「NUM」とか「CAPS」とか「カナ」とか表示して、
現在の状態を表示してくれるものがあるじゃないですか。
キーボード上で言えば、NumLock、CapsLock、ScrollLockのランプみたいなものです。
そんなわけで、せっかくレスいただいたのですが、説明の仕方が悪かったようで、
求める解答ではないようです。
すいませんでした。
引き続き情報募集します。
>トグルとかと言う表現のほうがいいのでしょうか?
「いいいのでしょうか?」ではなくて,状態をON,OFFに指定できるのをトグル
といいます.
トグル状態は,GetKeyStateで取得した値の第一ビットがフラグとなって
いますので,これで判断します.たとえば[CapsLock]は
GetKeyState( VK_CAPITAL ) and 1 > 0 then
のように判定します.
> 「いいいのでしょうか?」ではなくて,状態をON,OFFに指定できるのをトグル
> といいます.
ありがとうございます。
単語知らずで、すいませんでした。
では、そのトグル状態を正しく表示するには、どう監視するのが一番いいのでしょう?
最初の書き込みで「キーの状態取得」と書いていますが、これが「トグル状態の取得」の間違いで、
GetKeyStateで判断できることはわかっています。
> スレッドがメッセージキューからキーメッセージを読み出すたびに
Mr.XRAYさんの参考URLでは、このような書き出しで記載されています。
ということは、Application.OnMessage でキーメッセージを受け取ったときに
状態確認するのが一番なのでしょうか?
それとも、他にいいタイミングがあるのでしょうか?
トグルという表現を知らなかったせいで、意図を伝え切れませんでしたが、
これで最初の質問の意図が伝わったでしょうか?
よくわかりませんが、VB のものがヒットしました。参考になるでしょうか?
>いうことは、Application.OnMessage でキーメッセージを受け取ったときに
>状態確認するのが一番なのでしょうか?
>それとも、他にいいタイミングがあるのでしょうか?
それは何ともいえません.開発するアプリの仕様で決めていくことになる
でしょう.キーの検出ということに絞れば,キーの操作を捕らえるわけですか
ら,単純に考えば,キーフックでもいいと思います.
[参考URL]
http://homepage2.nifty.com/Mr_XRAY/Halbow/Notes/N006.html
>それは何ともいえません.開発するアプリの仕様で決めていくことになる
誤解のないように... (^_^);
ある目的の動作を実現するにはいろいろなコーディング方法があると思います.
どの方法がいいかというのは,難しい問題です.でも,正常に動いてナンボ
です.その意味では,ママんさんの方法(サブクラス化)でも構わないと思い
ます.この動作には,この方法でなければいけないというものがあるとした
ら,私の提供しているコンポのコードなんか無茶苦茶です(笑).
方法によっては,微妙に動作が異なる場合があります.これは,実際にコー
ディングして,いろいろ動作させてみて確認するしかありません.
または,ネット上の解説などを参考にするのも一つの手です.
わからんちん さん、Mr.XRAY さん、レスありがとうございます。
わからんちん さん
> よくわかりませんが、VB のものがヒットしました。参考になるでしょうか?
これによると、Application.OnIdleで更新しているようです。
「OnIdleでええんかいな(えせ関西人風)」でつっこんでみましたが、
これでやってみたところ、うまく動作しているようなので、
当面、これで様子を見てみることにします。
何より、ラクだし(^^ゞ
> >それは何ともいえません.開発するアプリの仕様で決めていくことになる
>
> 誤解のないように... (^_^);
誤解しましt・・・(笑)
「開発するアプリの仕様で決めていくことになる」のは百も承知で、
「一般的にどうしているのか?」という感じでした。
というのも、Application.OnMessage しか思いつかず、「それってあまりにスマートじゃないぞ」と思い、質問したのです。
いくつかの候補があがれば、そこから検証して実装を確定したらいいわけでして。。。
逆に、「どのような手法があるか?」という質問のほうが、答えやすかったということですかね?
いざ質問者にまわると、回答者に理解してもらいやすい質問の仕方も難しい(^^ゞ
ありがとうございました。
これで解決とします。
>逆に、「どのような手法があるか?」という質問のほうが、答えやすかったということですかね?
いや,これは最初の質問の
>ちなみに、GetKeyState(VK_KANA) で、キーの状態取得しています。
で理解できましたが,他のレスとのやりとりでの関係で...
でも,スレッドの書き込み内容は,他の方にも参考になると思いますので,
良しとして下さい (^_^;)
ツイート | ![]() |