これに対してP/Invokeを使用するのとは異なる解決策が見つかりませんでした。
スキームに収まらない場合は、別の簡単な方法があります。
最初の問題:keydownイベントを傍受します。 KeyDownイベントハンドラはこの場合は便利ではないので、「下に」移動してWindowProcメッセージを取得する必要があります。
第2の問題:キーダウンイベントを処理する必要があることをコンテナコントロールに知らせます。 PostMessageを使用する以外の良い解決策を見つけることができませんでした。
は、DLLのインポートを宣言します。ユーザーコントロールのProcessCmdKeyを上書きその後
Imports System.Runtime.InteropServices
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function PostMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Boolean
End Function
:
Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
'If ALT has been pressed...
If (keyData And Keys.Alt) > 0 Then
'... if another key is pressed aswell...
If (keyData Xor Keys.Alt) > 64 Then
'...pass the information to the container to see if it is interested
PostMessage(Me.ParentForm.Handle, CType(msg.Msg, UInt32), msg.WParam, msg.LParam)
Return True
End If
End If
'Not a key we are interested in
Return MyBase.ProcessCmdKey(msg, keyData)
End Function
あなたが/ P /呼び出しませんことができない場合は、同様の効果を得るかもしれませんフォーカスを親コンテナ内のランダムコントロールに設定します。
だから、との代替のPostMessage:
Me.ParentForm.Controls(0).Focus()
しかし、これは、当然のことながら、任意のALT /キーの組み合わせのためにフォーカスを移動します。
これはトリックを行うように見えます!以前はP/Invokeを使用しなければなりませんでした。これは、ユーザー定義可能なAlt/Keyコンボがあるため、手動フォーカスよりもこのニーズを改善するようです。ありがとうございました! – downeysyndrome
@downeysyndrome '.ParentForm'がかなり明らかに良いときに' .Parent'への参照を使用したので、おそらく編集が必要です。 – Jimi
そうです!もう一度多くの感謝! – downeysyndrome