【问题标题】:Alt Codes not navigating out of User Control替代代码未退出用户控制
【发布时间】:2017-12-06 15:13:09
【问题描述】:

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

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

是否可以设置任何属性来允许此操作而无需编写自定义逻辑来处理?自定义逻辑的主要问题是其中一些替代代码可以由用户定义,当我认为这应该正常工作时,必须编写一个包罗万象的处理方法并不理想在普通的 Windows 窗体引擎中

【问题讨论】:

    标签: vb.net winforms


    【解决方案1】:

    我找不到与为此使用 P/Invoke 不同的解决方案。
    如果它不适合该方案,则可能有另一种简单的方法。

    第一个问题:拦截一个 KeyDown 事件。
    KeyDown 事件处理程序在这种情况下不是很有用,因此您必须“下”并获取 WindowProc 消息。
    第二个问题:让 Container 控件知道必须处理 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
    

    然后重写UserControl的ProcessCmdKey:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-19
      • 2011-06-04
      • 1970-01-01
      • 2010-09-07
      • 2016-06-29
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      相关资源
      最近更新 更多