2

2つのチェックボックスを備えたフォームがあります(1つは保持用ですCTRL-1つは保持用ですALT)。KeyDown Eventフォームのが正しく機能するように、両方のチェックボックスが無効になっています。/キーを押すとTTimer10msごとに同期するもあります。ALTCTRL

私のtimer

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 CheckBox1.Checked := ALTDOWN;  // ALTDOWN IS GLOBAL
 CheckBox2.Checked := CTRLDOWN; // CTRLDOWN IS GLOBAL
end;

私のKeyDown Event

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
 if Key = VK_MENU then begin
  ALTDOWN := TRUE;
  exit;
 end;
 if Key = VK_CONTROL then begin
  CTRLDOWN := TRUE;
  exit;
 end;
end;

私のKeyUP Event

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
 if Key = VK_MENU then begin
  ALTDOWN := FALSE;
  exit;
 end;
 if Key = VK_CONTROL then begin
  CTRLDOWN := FALSE;
  exit;
 end;
end;

これは、キーに問題なく機能しCTRLます。しかし、ALTキーが動かなくなったり、まったく表示されなかったりすることがあります。これは、キーのみを押したときに発生しALTます(他のキーを組み合わせて押した場合はありません)。

それはなぜですか、どうすればこれを修正できますか?

4

2 に答える 2

3

そのようにタイマーを実行する場合は、電話するだけでもかまいませんGetAsyncKeyState

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 CheckBox1.Checked := GetAsyncKeyState(VK_MENU)<0;
 CheckBox2.Checked := GetAsyncKeyState(VK_CONTROL)<0;
end;

OnKeyDownそして、あなたとOnKeyUpイベントハンドラーを取り除くだけです。システムがすでにそうしているときに、キーが上にあるか下にあるかを追跡しようとしても、実際には意味がありません。

タイマーの間隔がかなり短いです。とにかく、システムはそれらをそれほど頻繁に起動しません。正しく思い出せば、タイマーの分解能は通常約50msです。

于 2012-08-30T18:37:36.557 に答える
1

内部の方法を知りたい場合は、Microsoftのドキュメントを読んでください(KeyUpはそれです) http://msdn.microsoft.com/en-us/library/windows/desktop/ms646281.aspx

Altキーを離すのはシステムイベントであり、WM_KeyUpでは予期されないことがわかります。WM_SYSCOMMAND、WM_SYSKEYUP、およびWM_SYSKEYDOWNの監視も追加します。

于 2012-08-31T07:32:48.927 に答える