簡體   English   中英

如何在 UWP 中使用代碼模擬 Tab 鍵按下

[英]How to Simulate a Tab Key Press with Code in UWP

我正在嘗試使用屏幕上的按鈕來執行 Tab 和反向 Tab 的功能。 我希望應用程序使用這些其他按鈕在 Segment 按鈕之間切換,然后用戶可以使用 Enter 鍵選擇一個。 試圖使程序完全可通過鍵盤導航。

演示版面

我曾嘗試使用 KeyDown 事件,然后使用定向焦點導航,但我更希望系統模擬 Tab 鍵按下以跟隨 Tab 路徑。

這是我一直試圖解決的代碼,但它不完全是我想要的功能。

        private void Grid_KeyDown(object sender, KeyRoutedEventArgs e)
        {
            DependencyObject candidate = null;

            var options = new FindNextElementOptions()
            {
                SearchRoot = WeldPGrid,
                XYFocusNavigationStrategyOverride = XYFocusNavigationStrategyOverride.Projection
            };

            switch (e.Key)
            {
                case Windows.System.VirtualKey.Up:
                    candidate =
                        FocusManager.FindNextElement(
                            FocusNavigationDirection.Up, options);
                    break;
                case Windows.System.VirtualKey.Down:
                    candidate =
                        FocusManager.FindNextElement(
                            FocusNavigationDirection.Down, options);
                    break;
                case Windows.System.VirtualKey.Left:
                    candidate = FocusManager.FindNextElement(
                        FocusNavigationDirection.Left, options);
                    break;
                case Windows.System.VirtualKey.Right:
                    candidate =
                        FocusManager.FindNextElement(
                            FocusNavigationDirection.Right, options);
                    break;
            }
            // Also consider whether candidate is a Hyperlink, WebView, or TextBlock.
            if (candidate != null && candidate is Control)
            {
                (candidate as Control).Focus(FocusState.Keyboard);
            }
        }

作為最終結果,我希望將模擬的 Tab 按下放在側面按鈕的單擊事件或命令中,而不僅僅是使用方向鍵。 對這個問題的任何幫助將不勝感激!

但看起來這個庫可能有一種新的方式我只需要弄清楚如何使用它

在我們使用輸入注入之前,我們必須在應用程序清單中聲明此功能,因為它是非標准功能。 這是一項受限功能,這意味着您可以使用它安全地將您的應用發布到應用商店,但需要批准商店提交。

鍵盤輸入

InjectedInputKeyboardInfo類將是鍵盤輸入注入的基礎。 最重要的屬性是 VirtualKey,它指定與輸入相關的鍵。 使用 KeyOptions 我們可以指定更多選項,例如模擬按鍵事件。

private async void Button_Click(object sender, RoutedEventArgs e)
{
    InputInjector inputInjector = InputInjector.TryCreate();
    for (int i = 0; i < 10; i++)
    {
        var info = new InjectedInputKeyboardInfo();
        info.VirtualKey = (ushort)(VirtualKey.Tab);
        inputInjector.InjectKeyboardInput(new[] { info });
        await Task.Delay(1000);
    }        
}

更新

Shift+Tab

InputInjector inputInjector = InputInjector.TryCreate();
 for (int i = 0; i < 10; i++)
 {
     var shift = new InjectedInputKeyboardInfo();
     shift.VirtualKey = (ushort)(VirtualKey.Shift);
     shift.KeyOptions = InjectedInputKeyOptions.None;


     var tab = new InjectedInputKeyboardInfo();
     tab.VirtualKey = (ushort)(VirtualKey.Tab);
     tab.KeyOptions = InjectedInputKeyOptions.None;


     inputInjector.InjectKeyboardInput(new[] { shift,tab});

     await Task.Delay(1000);
 }

更新 1

為了釋放鍵,我們需要將鍵選項設置為KeyUp並再次調用InjectKeyboardInput

InputInjector inputInjector = InputInjector.TryCreate();
 var ctrl = new InjectedInputKeyboardInfo();
 ctrl.VirtualKey = (ushort)(VirtualKey.Control);
 ctrl.KeyOptions = InjectedInputKeyOptions.KeyUp;

 inputInjector.InjectKeyboardInput(new[] { ctrl });

您可以使用 WIN32 API,獲取應用程序的句柄並使用SendKeys.SendWait("{Tab}");

前任:

IntPtr handle = FindWindow(null, "YourApplicationName");
SetForegroundWindow(handle);
SendKeys.SendWait("{Tab}");
SendKeys.Flush();

如果您的 Tab 鍵順序設置正確,它將在您的控件中按您指定的次數進行 Tab 鍵切換。 盡管這模擬了實際輸入,因此如果您希望用戶在系統選項卡頂部提供輸入,它可能不會很好。

如果您想了解有關 WIN32 API 和鼠標和鍵盤輸入模擬的更多信息,這里有一個有用的鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM