WPF設置全局快捷鍵


網上的幾分文檔都似乎有點兒問題。也很可能是我自己的問題。下面是我的解決方案

 

第一步 引入到Winows API

偷懶直接寫在類里

 

   1: [DllImport("user32.dll")]
   2: public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);
   3: [DllImport("user32.dll")]
   4: public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

這邊可以參考兩個MSDN的鏈接

第一個是關於RegisterHotKey函數的,里面有關於id,fsModifiers和vk 的具體說明

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646309%28v=vs.85%29.aspx

第二個是Virtual-Key 的表,即RegisterHotKey的最后一個參數

http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx

 

第二步 注冊全局按鍵

 

這里先介紹一個窗體的事件SourceInitialized,這個時間發生在WPF窗體的資源初始化完畢,並且可以通過WindowInteropHelper獲得該窗體的句柄用來與Win32交互。

具體可以參考MSDN http://msdn.microsoft.com/en-us/library/system.windows.window.sourceinitialized.aspx

我們通過重載OnSourceInitialized來在SourceInitialized事件發生后獲取窗體的句柄,並且注冊全局快捷鍵

 

   1: private const Int32 MY_HOTKEYID = 0x9999;
   2:  
   3: protected override void OnSourceInitialized(EventArgs e)
   4: {
   5:     base.OnSourceInitialized(e);
   6:  
   7:     IntPtr handle = new WindowInteropHelper(this).Handle;
   8:     RegisterHotKey(handle, MY_HOTKEYID, 0x0001, 0x72);
   9: }

關於幾個常熟的解釋

MY_HOTKEYID 是一個自定義的ID,取值范圍在0x0000 到 0xBFFF。之后我們會根據這個值來判斷事件的處理。

RegisterHotKey的第三或第四個參數可以參考第一步

 

第三步 添加接收所有窗口消息的事件處理程序

 

上面只是在系統中注冊了快捷鍵,但是還要獲取消息的事件,並篩選消息。

繼續在OnSourceInitialized函數中操作

   1: protected override void OnSourceInitialized(EventArgs e)
   2: {
   3:     base.OnSourceInitialized(e);
   4:  
   5:     IntPtr handle = new WindowInteropHelper(this).Handle;
   6:     RegisterHotKey(handle, MY_HOTKEYID, 0x0001, 0x72);
   7:  
   8:     HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
   9:     source.AddHook(WndProc);
  10: }

 

下面來完成WndProc函數

   1: IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handle)
   2: {
   3:     //Debug.WriteLine("hwnd:{0},msg:{1},wParam:{2},lParam{3}:,handle:{4}"
   4:     //                ,hwnd,msg,wParam,lParam,handle);
   5:     if(wParam.ToInt32() == MY_HOTKEYID)
   6:     {
   7:         //全局快捷鍵要執行的命令
   8:     }
   9:     return IntPtr.Zero;
  10: }

 

之前看到的幾篇文章都是通過msg篩選的。

但是我測試后id,是在wParam參數中的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM