4


2

WinForms C#で集中制御を取得する最速の方法は?

アプリケーションのメインフォームウィンドウでProcessCmdKeyを使用して、特定のキーをテストし、Space、Right、Left、その他いくつかの特別な処理を行います。 ユーザーがネストされたユーザーコントロールのセット内のTextBoxに入力している場合でも、メインフォームのProcessCmdKeyが呼び出されます。 TextBoxコントロールにフォーカスがある場合、スペースを入力できないため、Spaceキーを処理したくありません。 現在フォーカスされているウィンドウのタイプをアプリケーション全体でどのようにテストできますか?

2 Answer


6


これでウィンドウハンドルを取得できます。

  [DllImport("user32.dll")]
  private static extern IntPtr GetFocus();

その後、http://msdn.microsoft.com/en-us/library/system.windows.forms.control.fromhandle.aspx [Control.FromHandleを使用して、そのハンドル(ある場合)に関連付けられた.NETコントロールを取得できます。 ]。


0


動作しているように見えるものを見つけました:

[DllImport("user32.dll")]
static extern IntPtr GetFocus();

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    IntPtr wndHandle = GetFocus();
    Control focusedControl = FromChildHandle(wndHandle);
    if(focusedControl is DevExpress.XtraEditors.TextBoxMaskBox)
    {
       return base.ProcessCmdKey(ref msg, keyData);
    }
    ...
}