2017-12-06 3 views
4

アプリケーションのメイン処理フォームでは、アルファコード(アルファベットを使用してコントロールに素早くナビゲートするためのラベルテキストとして&ラベルを持つ)を使用して、ユーザーが伝統的なナビゲーションフローから移動する必要がある場合の画面 - しかし、最近我々は行き詰まりに遭った:アルトコードがユーザコントロールからナビゲートしない

私たちはフォーム内のかなりの部分を扱うユーザーコントロールを持っています。 altコード(Alt-R)を共有し、別のコントロールをユーザーコントロールの外に置いてください。通常、これは問題ではありません。Alt-Rに設定するだけで、Alt-Rで両者を切り替えることができるからです。ただし、コントロールの1つはユーザーコントロールの内部にあるため、フォーカスがユーザーコントロール内にある場合、Altコントロールを共有する2つのコントロールを使用してユーザーコントロールの外部に切り替えることはありません。

カスタムロジックを作成せずに処理できるプロパティがありますか?カスタムロジックの主な問題は、これらのaltコードのいくつかはユーザー定義可能であり、これを想像すると、包括的な処理方法を記述するのが理想的ではないということです。通常のWindowsフォーム内でエンジン

答えて

3

これに対して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 /キーの組み合わせのためにフォーカスを移動します。

+0

これはトリックを行うように見えます!以前はP/Invokeを使用しなければなりませんでした。これは、ユーザー定義可能なAlt/Keyコンボがあるため、手動フォーカスよりもこのニーズを改善するようです。ありがとうございました! – downeysyndrome

+0

@downeysyndrome '.ParentForm'がかなり明らかに良いときに' .Parent'への参照を使用したので、おそらく編集が必要です。 – Jimi

+0

そうです!もう一度多くの感謝! – downeysyndrome

関連する問題