キーボードバッファーをクリアーはできますか。

解決


武田  2009-04-18 00:07:47  No: 34046

よろしくお願いします。WindowsXP Delphi6 Personalです。
自作アプリの中のあるメニューで
Application.OnMessage := MsgHandler;を有効にして
文字キーで内容を分岐する作業が出来るようになります。

ところが、このメニューを始める前に文字キーを押しておくと
このメニューに入ったとたん、まだ意図したキーを押していないのに、
文字キーバッファーにたまった文字キーの作業をしてしまいます。

そこで、このメニューに入る前にキーバッファーをクリアーしたいのですが
そのようなことが出来るでしょうか?よろしくご指導お願いします。

下記で文字キーを押しわけて作業の処理を分岐しています。
procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean);
begin
        if  (GetAsyncKeyState(90) <> 0) then begin Sleep(250);SlideShowDisp(1);end
        else
        if  (GetAsyncKeyState(65) <> 0)  hen begin Sleep(250);SlideShowDisp(1);end


  2009-04-18 00:37:01  No: 34047

http://www.asahi-net.or.jp/~qz1s-kmy/delphi/busywrite.htm

の中の
while PeekMessage(Msg, NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE) do;
みたいなのを処理の最後に入れてみてはどうでしょう。


武田  2009-04-18 04:46:30  No: 34048

「の」さんお返事有り難うございます。
すみません、長時間処理する対策と今回の質問がどうリンクするのか理解できませんでした。
説明が悪いかもしれません。
アプリが起動中で、キーを受け付けないモードの時(たとえばEditやmemoにカーソルがないとき)、文字キーを押すと外見上はなにも起こりませんが
押された文字キーを記憶していると思います。
このときあるJobをしようと
procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean);
を作動開始したとき、バッファーの文字キーを押されたものとして、
定められた仕事をしてしまうから、
この機能開始前にキーバッファーをクリアーしたいという質問です。
説明がまずくてすみません。


TS  2009-04-18 05:06:25  No: 34049

>この機能開始前にキーバッファーをクリアーしたいという質問です。

>http://www.asahi-net.or.jp/~qz1s-kmy/delphi/busywrite.htm
上記の記事中

ループ中でキーボードメッセージとマウスメッセージを捨ててしまっている。
とありますが、このキーボードメッセージ部は
while PeekMessage(Msg, NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE) do;

ではないのですか、と言うことは「の」がすでに答えておられますが
これは試されましたか。


TS  2009-04-18 05:07:21  No: 34050

失礼しました「の」ではなく「の」さんです。


あるいは...  2009-04-18 05:49:02  No: 34051

このようにカエルとか
 if (GetAsyncKeyState(90) and $8000 <> 0) then
 if (GetKeyState(65) and $8000 <> 0) then


D  2009-04-18 07:50:02  No: 34052

Application.OnMessageを使うのではなく、フォームのKeyPreviewプロパティをメニューでTrueにしてOnKeyDownかOnKeyPressイベントを使うのではだめなのでしょうか。

あるいはタイマーを使うとか。

procedure TForm1.Timer1Timer(Sender: TObject);
  function IsKeyDown(Key: SHORT): Boolean;
  var
    li_Code: SHORT;
  begin
    li_Code := GetAsyncKeyState(Key);
    Result  := BOOL(Hi(li_Code)) and BOOL(Lo(li_Code));
  end;
begin
  //自アプリがアクティブなときのみ
  if (Application.Active) then begin
    if (IsKeyDown(90)) then begin
      SlideShowDisp(1);
    end else if (IsKeyDown(65)) then begin
      SlideShowDisp(1);
    end;
  end;
end;


武田  2009-04-18 08:11:45  No: 34053

みなさんご指導有り難うございます。
TSさんのwhile PeekMessage(Msg, NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE) do;
をどう使えばキーボードバッファーがクリアーされてJobが開始できるのか
力不足でまだ理解できませんでした。
あるいは...さんのif (GetAsyncKeyState(90) and $8000 <> 0) then
でうまくいきました。有り難うございました。
DさんのonkeyDownなどを使うのは以前試したのですが
画像や動画を標準ソフトで表示する場合、自アプリは陰に隠れて機能しなかったように記憶しています。
自アプリの前面にマルチメディアプレイヤーなどが
表示されてなおかつキー操作が効かないといけない条件があります。
しかし今後再挑戦してみます。
有り難うございました。


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

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






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