2011-12-21 6 views
2

私のアプリケーションでは、CTRL + Sを押すと、フォーム(キープレビューを有効にした状態)がこれを取得して文書を保存します。しかし、例えばエディットコントロールのようなものに焦点を当てると、迷惑な「丁」音や一般的には窓音が聞こえます。どのように私はこの音を避けるのですか?CTRL + Sをキャプチャするときにウィンドウを消す方法は?

ここでは、このキーイベントの私のフォームのキャプチャ...

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; 
    Shift: TShiftState); 
var 
    C: String; 
begin 
    if not fChanging then 
    Modified; 
    if ssCtrl in Shift then begin 
    C:= LowerCase(Char(Key)); 
    if C = 's' then begin 
     DoSave; 
     Key:= 0; //Tried this but didn't work 
    end else 
    if C = 'c' then begin 
     //Copy selected item(s) 
    end; 
    end; 
end; 

PSだ - これらのイベントをキャプチャするより標準的な方法はありますか?私は間違ったことをしていると確信しているので、私はこれらの重要な出来事を音なしで得なければならない別の方法があると確信しています。

+0

私は決してアクションリストを調べる時間をとらなかったことが判明しました。これはeです私はショートカット(と他の多くのもの)をキャプチャする必要があります。私は基本的にそれが何をしているのか知っていましたが、今までそれを使っていませ –

+0

はい、常にすべてのユーザー非表示イベントに対してアクションを使用してください –

答えて

7

物事のカップル:

  • FormKeyPress代わりのFormKeyDownにあなたのコードを入れてみてください。これはKey := 0;コードの作業を行います...あなたは、CTRLがGetKeyState()(私はもともとここにGetAsyncKeyState()を持っていましたが、ロブ・ケネディが指摘するように、GetKeyState() is a much better option)のようなものを使用することによって、けれども手動でチェックを処理する必要があります。
  • 代わりにアクションを使用してください。あなたのフォームにTActionListを入れてダブルクリックし、アクションを追加してCTRL-Sのホットキーを設定してください。保存コードをOnExecuteイベントハンドラに追加してください。これは私が信じる「適切な」方法です。

これは役に立ちます。

+0

+1と同意していただき、ありがとうございます。 –

+0

問題ありません。 :) – Nat

+5

GetAsStatusではなく、GetKeyStateを使用します。後者は現在のキー*の状態を示していますが、前者は現在のキーボードメッセージが生成された時点のキーの状態を示しています。忙しいシステムでは、これらの2つの時間はかなり異なる場合があります。 –

2

デルファイコードはdisable the system beepです。

+0

しかし、このシナリオのためだけではなく、再び有効にされるまで無効になります。 –

+1

+1良い代替参照ですが、醜い副作用があります。 –

+0

@ジェリードッジ...はい醜い副作用;) – PresleyDias

2

なぜアクションを使用しないのですか?それがショートカットを処理する最善の方法です。

+0

+1しかし、他の回答は、より多くの情報を持っていたので受け入れました。 –

+0

@ジェリードッジ:それでは幸せに! ;) –

関連する問題