Vb.net Alt代码未在用户控制之外导航

Vb.net Alt代码未在用户控制之外导航,vb.net,winforms,Vb.net,Winforms,在我们的应用程序的主处理表单中,如果用户需要跳出传统的导航流程,我们使用alt代码(例如,将&Label作为标签文本,使用alt-L快速导航到控件)进行快速导航,以在屏幕上跳跃-但最近我们遇到了一个障碍: 我们有一个用户控件,它在表单上处理相当多的内容,其中有一个控件需要与用户控件之外的另一个控件共享alt代码(alt-R)。通常,这不会是一个问题,因为我们可以将它们都设置为Alt-R,Alt-R将在两者之间切换。由于其中一个控件位于用户控件内,而另一个控件则不在用户控件内,因此一旦焦点位于用户

在我们的应用程序的主处理表单中,如果用户需要跳出传统的导航流程,我们使用alt代码(例如,将&Label作为标签文本,使用alt-L快速导航到控件)进行快速导航,以在屏幕上跳跃-但最近我们遇到了一个障碍:

我们有一个用户控件,它在表单上处理相当多的内容,其中有一个控件需要与用户控件之外的另一个控件共享alt代码(alt-R)。通常,这不会是一个问题,因为我们可以将它们都设置为Alt-R,Alt-R将在两者之间切换。由于其中一个控件位于用户控件内,而另一个控件则不在用户控件内,因此一旦焦点位于用户控件内,它就不会在用户控件外切换,因为两个控件共享一个Alt代码


是否有任何属性可以设置为允许此操作而无需编写自定义逻辑来处理?自定义逻辑的主要问题是,其中一些alt代码可以由用户定义,如果我认为这应该在正常的Windows窗体引擎中工作,那么编写一个包罗万象的处理方法就不太理想了。我找不到与使用p/Invoke不同的解决方案。
如果它不适合这个方案,可能会有另一种简单的方法。

第一个问题:截获一个keydown事件。在这种情况下,KeyDown事件处理程序没有那么有用,因此您必须进入“下”并获取WindowProc消息。
第二个问题:让容器控件知道必须处理keydown事件。除了使用PostMessage,找不到任何好的解决方案

声明dll导入:

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
如果您不能/不会p/Invoke,您可能会获得类似的效果,将焦点设置为父容器中的随机控件。
因此,将PostMessage替换为:

Me.ParentForm.Controls(0).Focus()

但是,这当然会移动任何ALT/键组合的焦点。

这似乎可以做到这一点!我们以前不得不使用P/Invoke,考虑到我们有一些用户可定义的Alt/Key组合,这似乎比手动关注更好地解决了这个问题。谢谢大家!@downeysyndrome可能需要编辑,因为我使用了对
.Parent
的引用,而这显然是更好的
.ParentForm
Me.ParentForm.Controls(0).Focus()