易创云论坛

 找回密码
 立即注册
查看: 3659|回复: 0

VSTO应用程序中加入键盘钩子

[复制链接]

170

主题

178

帖子

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
100700
发表于 2021-9-26 16:41:36 | 显示全部楼层 |阅读模式


原文链接:https://www.cnblogs.com/2018/archive/2010/12/01/1893891.html
  1. KeyboardHook hook;
  2.         private void ThisAddIn_Startup(object sender, System.EventArgs e)
  3.         {
  4.            hook = new KeyboardHook();
  5.             hook.InitHook();
  6.         }

  7.         private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
  8.         {
  9.             hook.UnHook();
  10.         }
  11.     }
  12. //钩子具体处理逻辑是:
  13.     class KeyboardHook
  14.     {
  15.         #region (invokestuff)
  16.         [DllImport("kernel32.dll")]
  17.         static extern uint GetCurrentThreadId();
  18.         [DllImport("user32.dll")]
  19.         static extern IntPtr SetWindowsHookEx(int code, HookProcKeyboard func, IntPtr hInstance, uint threadID);
  20.         [DllImport("user32.dll")]
  21.         static extern bool UnhookWindowsHookEx(IntPtr hhk);
  22.         [DllImport("user32.dll")]
  23.         static extern int CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
  24.         #endregion

  25.         #region constans
  26.         private const int WH_KEYBOARD = 2;
  27.         private const int HC_ACTION = 0;
  28.         #endregion

  29.         delegate int HookProcKeyboard(int code, IntPtr wParam, IntPtr lParam);
  30.         private HookProcKeyboard KeyboardProcDelegate = null;
  31.         private IntPtr khook;
  32.         bool doing = false;

  33.         public void InitHook()
  34.         {
  35.             uint id = GetCurrentThreadId();
  36.             //init the keyboard hook with the thread id of the Visual Studio IDE   
  37.             this.KeyboardProcDelegate = new HookProcKeyboard(this.KeyboardProc);
  38.             khook = SetWindowsHookEx(WH_KEYBOARD, this.KeyboardProcDelegate, IntPtr.Zero, id);
  39.         }

  40.         public void UnHook()
  41.         {
  42.             if (khook != IntPtr.Zero)
  43.             {
  44.                 UnhookWindowsHookEx(khook);
  45.             }
  46.         }

  47.        private int KeyboardProc(int code, IntPtr wParam, IntPtr lParam)
  48.         {
  49.             try
  50.             {
  51.                 if (code != HC_ACTION)
  52.                 {
  53.                     return CallNextHookEx(khook, code, wParam, lParam);
  54.                 }

  55.                 if ((int)wParam == (int)Keys.Z && ((int)lParam & (int)Keys.Alt) != 0)
  56.                 {
  57.                     if (!doing)
  58.                     {
  59.                         doing = true;
  60.                         MessageBox.Show("Captured");
  61.                         doing = false;
  62.                     }
  63.                 }
  64.             }
  65.             catch
  66.             {
  67.             }

  68.             return CallNextHookEx(khook, code, wParam, lParam);
  69.         }
  70.     }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|易创云论坛 ( 吉ICP备17001024号-1 )

GMT+8, 2025-2-1 20:01 , Processed in 0.314780 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表