日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

WPF设置全局快捷键

發(fā)布時(shí)間:2025/3/15 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WPF设置全局快捷键 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

網(wǎng)上的幾分文檔都似乎有點(diǎn)兒?jiǎn)栴}。也很可能是我自己的問(wèn)題。下面是我的解決方案

?

第一步 引入到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);

這邊可以參考兩個(gè)MSDN的鏈接

第一個(gè)是關(guān)于RegisterHotKey函數(shù)的,里面有關(guān)于id,fsModifiers和vk 的具體說(shuō)明

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

第二個(gè)是Virtual-Key 的表,即RegisterHotKey的最后一個(gè)參數(shù)

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

?

第二步 注冊(cè)全局按鍵

?

這里先介紹一個(gè)窗體的事件SourceInitialized,這個(gè)時(shí)間發(fā)生在WPF窗體的資源初始化完畢,并且可以通過(guò)WindowInteropHelper獲得該窗體的句柄用來(lái)與Win32交互。

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

我們通過(guò)重載OnSourceInitialized來(lái)在SourceInitialized事件發(fā)生后獲取窗體的句柄,并且注冊(cè)全局快捷鍵

?

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: }

關(guān)于幾個(gè)常熟的解釋

MY_HOTKEYID 是一個(gè)自定義的ID,取值范圍在0x0000 到 0xBFFF。之后我們會(huì)根據(jù)這個(gè)值來(lái)判斷事件的處理。

RegisterHotKey的第三或第四個(gè)參數(shù)可以參考第一步

?

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

?

上面只是在系統(tǒng)中注冊(cè)了快捷鍵,但是還要獲取消息的事件,并篩選消息。

繼續(xù)在OnSourceInitialized函數(shù)中操作

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: }

?

下面來(lái)完成WndProc函數(shù)

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: //全局快捷鍵要執(zhí)行的命令 8: } 9: return IntPtr.Zero; 10: }

?

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

但是我測(cè)試后id,是在wParam參數(shù)中的。

轉(zhuǎn)載于:https://www.cnblogs.com/atskyline/archive/2012/09/20/2694878.html

總結(jié)

以上是生活随笔為你收集整理的WPF设置全局快捷键的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。