よろしくお願いします。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
http://www.asahi-net.or.jp/~qz1s-kmy/delphi/busywrite.htm
の中の
while PeekMessage(Msg, NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE) do;
みたいなのを処理の最後に入れてみてはどうでしょう。
「の」さんお返事有り難うございます。
すみません、長時間処理する対策と今回の質問がどうリンクするのか理解できませんでした。
説明が悪いかもしれません。
アプリが起動中で、キーを受け付けないモードの時(たとえばEditやmemoにカーソルがないとき)、文字キーを押すと外見上はなにも起こりませんが
押された文字キーを記憶していると思います。
このときあるJobをしようと
procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean);
を作動開始したとき、バッファーの文字キーを押されたものとして、
定められた仕事をしてしまうから、
この機能開始前にキーバッファーをクリアーしたいという質問です。
説明がまずくてすみません。
>この機能開始前にキーバッファーをクリアーしたいという質問です。
>http://www.asahi-net.or.jp/~qz1s-kmy/delphi/busywrite.htm
上記の記事中
ループ中でキーボードメッセージとマウスメッセージを捨ててしまっている。
とありますが、このキーボードメッセージ部は
while PeekMessage(Msg, NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE) do;
ではないのですか、と言うことは「の」がすでに答えておられますが
これは試されましたか。
失礼しました「の」ではなく「の」さんです。
このようにカエルとか
if (GetAsyncKeyState(90) and $8000 <> 0) then
if (GetKeyState(65) and $8000 <> 0) then
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;
みなさんご指導有り難うございます。
TSさんのwhile PeekMessage(Msg, NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE) do;
をどう使えばキーボードバッファーがクリアーされてJobが開始できるのか
力不足でまだ理解できませんでした。
あるいは...さんのif (GetAsyncKeyState(90) and $8000 <> 0) then
でうまくいきました。有り難うございました。
DさんのonkeyDownなどを使うのは以前試したのですが
画像や動画を標準ソフトで表示する場合、自アプリは陰に隠れて機能しなかったように記憶しています。
自アプリの前面にマルチメディアプレイヤーなどが
表示されてなおかつキー操作が効かないといけない条件があります。
しかし今後再挑戦してみます。
有り難うございました。
ツイート | ![]() |