まず最初に—でショートカットを作成することはお勧めしませんAlt。Windowsアプリケーションでは、Altキーはキーボードアクセラレータ用に予約されています。これが、コントロールのキャプションに下線が引かれた特定の文字が表示される理由です。たとえば、「&Journal」というキャプションが付いたボタンコントロールを使用すると、J̲ournalと表示され、マウスに触れずにキーボードからAlt+Jを押してそのボタンを「クリック」できるようになります。これは、アクセシビリティ上の理由から非常に重要です。 。
この動作の一貫性を維持したい場合で、ボタンがドロップダウンボタン(つまり、マウスでクリックしたときにメニューを表示するボタン)に似ている場合、タスクはかなり単純です。上記のようにボタンにラベルを付け(&
文字列内の文字を使用して目的のアクセラレータを示します。この場合は)、コードを配線して、通常のイベントハンドラの場合M
と同じようにドロップダウンメニューを表示します。Click
アプリケーションを混乱させて使いにくくしたい場合で、ドロップダウンボタンがない場合は、キーボードイベントを手動でインターセプトし、ウィンドウマネージャーをだます必要があります。言うまでもなく、これはさらに困難になります。
あなたが克服する必要がある主な問題は焦点です。フォーカスされたコントロールのみがキーボードイベントを受け取り、一度にフォーカスできるコントロールは1つだけです。したがって、ボタンに加えて複数のコントロール(テキストボックスなど)を含むフォームがある場合、それらの他のコントロールのいずれかがボタンの代わりにフォーカスを持っている可能性があります。つまり、キーボードイベントを受信し、場合によっては独自の方法でそれらに反応します。これが、イベントが期待どおりに機能しない理由KeyPress
です(イベントKeyDown
とKeyUp
イベントで同じ問題が発生します)。これらのイベントは特定のコントロールに関連付けられており、それらが接続されているコントロールがフォーカスされている場合にのみ発生します。
これを回避したい場合は、「より高い」レベルでキーボードイベントを処理する必要があります。ProcessCmdKey
WinFormsでそれを行う標準的な方法は、メソッドをオーバーライドすることによってフォームレベルで行うことです。オーバーライドされた方法では、目的のキーボードの組み合わせをテストし、必要に応じてポップアップメニューを表示します。例えば:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Alt | Keys.M))
{
cmsJournal.Show(btnJournal, new Point(0, 0 - cmsJournal.Height));
return true; // indicate that you handled the key event
}
return base.ProcessCmdKey(ref msg, keyData);
}
または、メソッドを呼び出すこともできますPopJournalMenu
。ただし、そのメソッドtsmiAPPayment
を呼び出す必要があるのは何か、またはその理由はわかりません。前の質問で、コンテキストメニューがフォーカスされていることを確認するために使用しようとしている印象を受けましたSelect
。あなたはそれをする必要はありません。メソッドはすでにそれを処理します。Select
Show