zoukankan      html  css  js  c++  java
  • WPF设置全局快捷键

    转自:http://www.cnblogs.com/atskyline/archive/2012/09/20/2694878.html

    第一步 引入到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参数中的。

  • 相关阅读:
    HTML_<select>
    HTML_<a>
    MySQL_知识点
    MySQL_常用SQL语句
    GIT
    MyBatis_传入参数的问题
    js函数防抖与节流总结
    node 常用方法 生成密钥 token验证 验证码生成 (持续更新)
    node 登陆拦截中间件(egg)
    js 给页面容器增加水印
  • 原文地址:https://www.cnblogs.com/wangjixianyun/p/3237371.html
Copyright © 2011-2022 走看看