簡體   English   中英

如何覆蓋默認的“全局”鍵盤快捷鍵並創建我自己的快捷鍵?

[英]How can I override default “global” keyboard shortcuts and create my own instead?

我了解 WPF 中的基本事件路由/冒泡(雖然顯然還不夠)……我想要做的是在我的 WPF 桌面應用程序中使用基本的鍵盤快捷鍵。 例如,我有一個 ListBox,當用戶按下Page-UpPage-Down (在應用程序中可以聚焦任何內容)時,我希望列表框選擇其上一項或下一項(如果適用)。

這是我到目前為止所擁有的,但它不起作用。 這是一個名為“Main”的窗口的構造函數:

public Main()
{
    InitializeComponent();

    // Initialize keyboard shortcuts
    KeyDown += (s, e) =>
    {
        var viewModel = GetActiveViewModel();
        if (e.Key == Key.PageUp)
        {
            viewModel.SelectPreviousItem();
            e.Handled = true;
        }
        else if (e.Key == Key.PageDown)
        {
            viewModel.SelectNextItem();
            e.Handled = true;
        }
    };
}

此代碼沒有工作,活動控件正在“竊取”事件並實現默認行為,例如,如果我選擇了一個文本框,則文本框正在移動光標,如果我選擇了列表框,則列表框正在將選定的索引移動一個“頁面”,而不是我想要的單個項目。

如何指示 WPF“忽略”任何默認鍵盤掛鈎並用我自己的邏輯替換它們? 我知道我將“覆蓋”某些控件的默認行為(例如,文本框中的Page-Up / Page-Down將不再移動光標),沒關系,這就是我想要的。

您可以做的是注冊到PreviewKeyDown事件。

WPF 中發生的事情是每個控件都可以有一個事件的默認實現,然后將“處理”屬性設置為 true,這會告訴 WPF 中的可視化樹停止傳播事件。

嘗試這個:

PreviewKeyDown += (s, e) =>
{
   var viewModel = GetActiveViewModel();
   if (e.Key == Key.PageUp)
   {
      viewModel.SelectPreviousItem();
      e.Handled = true;
   }
   else if (e.Key == Key.PageDown)
   {
      viewModel.SelectNextItem();
      e.Handled = true;
   }
};

那完全行不通。

您將需要通過隧道獲取在此處列表中找到的 OS 注冊的全局熱鍵:

使用 KEYBOARD_LL 掛鈎 Win32 操作系統代碼

SetWindowsHookEx((int) HookType.WH_KEYBOARD_LL, _keyboardProc, moduleHandler, 0);

我為一家包裝 WPF CommandBindings -> WF -> Win32 LL 的公司執行此操作。

一些最大的選項,如 Ctl+Alt+Del,您可以從注冊表中取出並刪除屏幕中的所有選項,如注銷、任務管理器等。

暫無
暫無

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

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