【问题标题】:What should I do to raise an event after Ctrl+Key click in Windows 10 C# UWP app?在 Windows 10 C# UWP 应用程序中单击 Ctrl+Key 后,我应该怎么做才能引发事件?
【发布时间】:2018-03-30 08:50:21
【问题描述】:

我想要这样,每当用户单击快捷按钮时,我的 webview(在我的应用程序内)应该导航到网页,例如 - CTRL+H ,同时关注在网络视图上。

这是我目前写的代码-

对于 webview(XAML)-

for keyup(.cs)-

这不起作用,请提出任何更正。

编辑- 根据 Mark W 的建议,我将我的 c# 代码更改为这个-

private static bool IsCtrlKeyPressed()
{
    var ctrlState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Control);
    return (ctrlState & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down;
}

private void taga_keyUp(object sender, KeyRoutedEventArgs e)
{
    if (IsCtrlKeyPressed())
    {
        switch (e.Key)
        {
            case VirtualKey.H: taga.Navigate(new Uri("http://www.bing.com")); break;           
}
    }
}

这也不起作用。

【问题讨论】:

    标签: c# windows visual-studio uwp


    【解决方案1】:

    您可以根据文档使用GetKeyPressed方法来检测修饰键。

    https://docs.microsoft.com/en-us/windows/uwp/design/input/keyboard-events

    摘录:

    private static bool IsCtrlKeyPressed()
    {
        var ctrlState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Control);
        return (ctrlState & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down;
    }
    

    【讨论】:

    • 试过但没有用,当我点击 Ctrl+h 键时没有任何反应。
    【解决方案2】:

    根据WebView类的备注:

    如事件表所示,WebView 不支持从 UIElement 继承的大部分用户输入事件,例如 KeyDown、KeyUp 和 PointerPressed。

    所以KeyUp 可能不适用于WebView。一个常见的解决方法是将InvokeScriptAsync 与JavaScript eval 函数一起使用以使用HTML 事件处理程序,并使用来自HTML 事件处理程序的window.external.notify 通过WebView.ScriptNotify 通知应用程序。对于您的方案,您可以考虑使用CoreWindow 来监听KeyUp 事件,而不是作为一种解决方法。例如:

    public MainPage()
    {
        this.InitializeComponent();
        Window.Current.CoreWindow.KeyUp += CoreWindow_KeyUp;
    }
    
    private void CoreWindow_KeyUp(CoreWindow sender, KeyEventArgs args)
    {        
        if (IsCtrlKeyPressed())
        {
            switch (args.VirtualKey)
            {
                case VirtualKey.H: taga.Navigate(new Uri("http://www.bing.com")); break;
            }
        }
    }
    private static bool IsCtrlKeyPressed()
    {
        var ctrlState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Control);
        return (ctrlState & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down;
    }
    

    【讨论】:

    • 我还是不明白,我需要使用 "InvokeScriptAsync" 吗,你提供的代码,我如何使用这个代码?
    • @aryaman InvokeScriptAsync 是常用的方式,但这需要更改HTML页面。对于您的情况,导航到您可能无法更改的站点,您可以尝试我的代码,这不是使用InvokeScripAsync 的方式。如果要使用InvokeScripAsync方法,请先google。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    相关资源
    最近更新 更多