Lync联系人列表WPF控制热键/快捷键从Web浏览器中窃取按键

时间:2013-05-02 02:33:45

标签: c# wpf webbrowser-control keyboard-shortcuts lync

问题

Lync有一些热键/快捷键,用于更改ContactList控件中的选项卡。这些热键是'g','s'和'r'。当我按下任何这些键同时将HTML输入控件聚焦在任何网页上的WebBrowser内时,按键将转到ContactList控件而不是WebBrowser控件。 键入浏览器外部的控件(例如WPF TextBox控件)时,按键不会被盗。

重现问题的步骤

  1. 安装了Microsoft Lync 2013
  2. http://www.microsoft.com/en-au/download/details.aspx?id=36824
  3. 下载并安装Microsoft Lync 2013客户端sdk
  4. 创建一个.net 4.0 wpf应用程序。将ContactList控件拖放到MainWindow中,以便自动设置引用和命名空间
  5. 将以下代码粘贴到MainWindow.xaml中的Window元素中

    <Window...
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <controls:ContactList Name="contactList1" Grid.Column="0" />
        <WebBrowser Grid.Column="1" Source="http://www.google.com"  />
    </Grid>
    

  6. 按“r”,“g”或“s”键进入谷歌搜索框,注意按键如何转到lync控件而不是搜索框。任何其他键都可以正常工作。

  7. 我尝试过的事情

    我试图阻止关键事件冒泡到ContactList控件。但是我没有取得多大成功。

    disable event-bubbling c# wpf

    WPF prevent event bubbling outside of a control

1 个答案:

答案 0 :(得分:1)

在这里找到答案:AccessKey Pressed Event Raised when pressing access key without ALT

出现此问题的原因是WPF不需要按住alt以使AccessKeys工作。 WinForms的用途。 在这种情况下,在WebBrowser中按“g”,“s”或“r”会聚焦ClientControl,但我只希望在按住alt时发生这种情况。我不知道为什么这个问题似乎只发生在WebBrowser上。

来自msdn链接:

  

我们在标签上定义了一个访问键,它将焦点放在a上   文本框。

     

我们在同一个用户控件上有第二个只读文本框。

     

在只读文本框内单击并按下访问键时   没有ALT(例如L而不是ALT + L),焦点改变就完成了   反正。

     

是否可以禁用此行为,即是否可以   确保访问键仅在与其一起按下时才起作用   ALT?

     

以下xaml显示了该问题:

<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
SizeToContent="Height"
Width="300" WindowStartupLocation="CenterScreen">
    <StackPanel Orientation="Vertical">
        <TextBox IsReadOnly="True" Text="ReadOnly - give focus and press l" />
        <Label Content="_Label:"  Target="{Binding ElementName=box}"/>
        <TextBox x:Name="box" />
    </StackPanel>
</Window>

解决方案

  

菜单和工具栏menmonics无需按Alt键即可工作。我们决定   我们将在所有情况下都有统一的行为,因此访问关键工作   按下Alt键。

     

据我所知,这与表格不符,我们会   请考虑此问题并更改下一版本中的行为。

     

现在作为一种解决方法,您可以为所有人重新设置类处理程序   AccessKeyPressed事件并在Alt键不处理时处理事件   按压。

EventManager.RegisterClassHandler(typeof(UIElement), AccessKeyManager.AccessKeyPressedEvent, new AccessKeyPressedEventHandler(OnAccessKeyPressed));

private void OnAccessKeyPressed(object sender, AccessKeyPressedEventArgs e)
{
    if (!e.Handled && e.Scope == null && (e.Target == null || e.Target == label))
    {
        // If Alt key is not pressed - handle the event
        if ((Keyboard.Modifiers & ModifierKeys.Alt) != ModifierKeys.Alt)
        {
            e.Target = null;
            e.Handled = true;
        }
    }
}

我将解决方案代码添加到MainWindow类中,一切都按预期工作。