2011-12-22 5 views
0

私のコントロールにフォーカスがない場合でも、Altキーが押されたときにキャプチャしたい。ユーザーが修飾キーを押したときにどのようにキャプチャするのですか?

System.Windows.Forms.Controlにはこれと似たようなものがありますか?

public void OnModifierKeyPressed(KeyEventArgs e); 

また、WndProcメッセージを処理していますか?

ありがとうございます。


EDIT:

私は、ユーザが(ボタンがするように)私のコントロールでキーアクセラレータの下線をペイントするAltキーを押したときにキャプチャする必要があります。

WndProcMessage as integer: 
296 
8235 
15 
133 
20 

EDIT2:


は最後に、私が見つかりました。私は、ユーザーのプレスALTとコントロールがフォーカスを持っていない場合は、以下のメッセージがコントロールに送信されていることを確信しています関与しているメッセージ、here

Msg: WM_UPDATEUISTATE      0x0128 
WParam: UISF_HIDEACCEL       0x2 

しかし、コーディグレーは、あなたがControl.ShowKeyboardCuesプロペを使用することができ、これを必要としない、言ったようにrty。

+0

たときに、ユーザーpresset Altキー**あなたは確かにキャプチャすることができます**別のキーで。 Altだけではキーイベントは発生しません。しかし、私はおそらく完全に間違って:-) –

+0

この記事のコードを試してください:http://stackoverflow.com/questions/2226476/problems-detecting-alt-key-on-the-control-keyup-event – keyboardP

+0

ああ、新しい情報あなたが間違った方法で問題を解決しようとしていることを示しています。私は私の答えを更新する必要があります... –

答えて

4

フォーカスのあるコントロールのみがキーボードイベントを受け取ります。したがって、現在のカスタムコントロールにフォーカスがないときにキーの押下を検出できるように、カスタムコントロールでオーバーライドする方法やイベントを処理する方法はありません。

いずれにしても、質問に追加された新しい情報は、これが不適切であることを示しています。適切なタイミングでキーボードアクセラレータを描画するだけであれば、はるかに簡単な解決策があります。

カスタムコントロール(コントロールのテキストを描画する)のPaintイベントハンドラでは、Control.ShowKeyboardCues propertyの値をチェックする必要があります。値がtrueの場合は、キーボードアクセラレータを表示する必要があります。それ以外の場合は、描画を省略してください。

同様に、Control.ShowFocusCues propertyの値もチェックする必要があります。これは、コントロールの周囲にフォーカス矩形を描画するかどうかを指示します。
ControlPaint.DrawFocusRectangle methodを使用して、フォーカス矩形を描画します。

ような何か:
に(私は私の前に.NETコンパイラを持っていないので、コードがエラーを持っているかもしれません...)

// Draw the text 
using (StringFormat sf = new StringFormat()) 
{ 
    sf.Alignment = StringAlignment.Center; 
    sf.LineAlignment = StringAlignment.Center; 
    sf.HotkeyPrefix = this.ShowKeyboardCues ? HotkeyPrefix.Show : HotKeyPrefix.Hide; 

    if (this.Enabled) 
    { 
     using (Brush br = new SolidBrush(this.ForeColor)) 
     { 
      g.DrawString(this.Text, this.Font, br, this.ClientRectangle, sf); 
     } 
    } 
    else 
    { 
     SizeF sz = g.MeasureString(this.Text, this.Font, Point.Empty, sf); 
     RectangleF rc = new RectangleF(Point.Empty, sz); 
     ControlPaint.DrawStringDisabled(g, this.Text, this.Font, this.BackColor, rc, sf); 
    } 
} 

// Draw the focus rectangle 
if (this.ShowFocusCues && this.ContainsFocus) 
{ 
    ControlPaint.DrawFocusRectangle(g, this.ClientRectangle);   
} 
+0

完璧な答え、ありがとう! –