可能在使用VSTO技术对Office的相关程序进行操作时,会碰到用程序去控制一些快捷键的操作,可以对键盘进行挂钩,此时使用P/Invoke函数实现。

原文链接:《VSTO应用程序中加入键盘钩子》 http://www.cnblogs.com/2018/archive/2010/12/01/1893891.html

原文如下:
在VSTO应用程序中有时为了处理一些快捷按键操作等实现一些特殊的功能,此时需要对键盘进行挂钩,此时使用P/Invoke函数实现,参考如下:
VSTO加载和卸载时进行钩子的初始化和卸载

代码KeyboardHook hook;private void ThisAddIn_Startup(object sender, System.EventArgs e){hook = new KeyboardHook();hook.InitHook();}private void ThisAddIn_Shutdown(object sender, System.EventArgs e){hook.UnHook();}}//钩子具体处理逻辑是:class KeyboardHook{#region (invokestuff)[DllImport("kernel32.dll")]static extern uint GetCurrentThreadId();[DllImport("user32.dll")]static extern IntPtr SetWindowsHookEx(int code, HookProcKeyboard func, IntPtr hInstance, uint threadID);[DllImport("user32.dll")]static extern bool UnhookWindowsHookEx(IntPtr hhk);[DllImport("user32.dll")]static extern int CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);#endregion#region constansprivate const int WH_KEYBOARD = 2;private const int HC_ACTION = 0;#endregiondelegate int HookProcKeyboard(int code, IntPtr wParam, IntPtr lParam);private HookProcKeyboard KeyboardProcDelegate = null;private IntPtr khook;bool doing = false;public void InitHook(){uint id = GetCurrentThreadId();//init the keyboard hook with the thread id of the Visual Studio IDE   this.KeyboardProcDelegate = new HookProcKeyboard(this.KeyboardProc);khook = SetWindowsHookEx(WH_KEYBOARD, this.KeyboardProcDelegate, IntPtr.Zero, id);}public void UnHook(){if (khook != IntPtr.Zero){UnhookWindowsHookEx(khook);}}private int KeyboardProc(int code, IntPtr wParam, IntPtr lParam){try{if (code != HC_ACTION){return CallNextHookEx(khook, code, wParam, lParam);}if ((int)wParam == (int)Keys.Z && ((int)lParam & (int)Keys.Alt) != 0){if (!doing){doing = true;MessageBox.Show("Captured");doing = false;}}}catch{}return CallNextHookEx(khook, code, wParam, lParam);}}

注意对于命名空间的引入,在程序中Keys.Z,Keys.Alt可以改为你想要控制的按键键盘,可以是是单一按键也可以是组合键。当然,也可以捕获复制、粘贴、撤销等等组合快捷键。

对于键盘、鼠标钩子的处理:《C#鼠标键盘钩子》http://blog.csdn.net/wangyong0921/article/details/8262631

对于键盘钩子的另一种处理:

using System;using System.Collections.Generic;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;namespace ICS.Common
{///   <summary> ///   这个类可以让你得到一个在运行中程序的所有键盘或鼠标事件 ///   并且引发一个带KeyEventArgs参数的.NET事件以便你很容易使用这些信息 ///   </summary>public class KeyBordHook{private const int WM_KEYDOWN = 0x100;private const int WM_KEYUP = 0x101;private const int WM_SYSKEYDOWN = 0x104;private const int WM_SYSKEYUP = 0x105;//全局的事件 public event KeyEventHandler OnKeyDownEvent;public event KeyEventHandler OnKeyUpEvent;public event KeyPressEventHandler OnKeyPressEvent;static int hKeyboardHook = 0;   //键盘钩子句柄 //鼠标常量 public const int WH_KEYBOARD_LL = 13;   //keyboard   hook   constant   HookProc KeyboardHookProcedure;   //声明键盘钩子事件类型. //声明键盘钩子的封送结构类型
        [StructLayout(LayoutKind.Sequential)]public class KeyboardHookStruct{public int vkCode;   //表示一个在1到254间的虚似键盘码 public int scanCode;   //表示硬件扫描码 public int flags;public int time;public int dwExtraInfo;}//装置钩子的函数 [DllImport("user32.dll ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);//卸下钩子的函数 [DllImport("user32.dll ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern bool UnhookWindowsHookEx(int idHook);//下一个钩挂的函数 [DllImport("user32.dll ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);[DllImport("user32 ")]public static extern int ToAscii(int uVirtKey, int uScanCode, byte[] lpbKeyState, byte[] lpwTransKey, int fuState);[DllImport("user32 ")]public static extern int GetKeyboardState(byte[] pbKeyState);public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);///   <summary> ///   墨认的构造函数构造当前类的实例并自动的运行起来. ///   </summary> public KeyBordHook(){Start();}//析构函数. ~KeyBordHook(){Stop();}public void Start(){//安装键盘钩子   if (hKeyboardHook == 0){KeyboardHookProcedure = new HookProc(KeyboardHookProc);hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().ManifestModule), 0);if (hKeyboardHook == 0){Stop();throw new Exception("SetWindowsHookEx   ist   failed. ");}}}public void Stop(){bool retKeyboard = true;if (hKeyboardHook != 0){retKeyboard = UnhookWindowsHookEx(hKeyboardHook);hKeyboardHook = 0;}//如果卸下钩子失败 if (!(retKeyboard)) throw new Exception("UnhookWindowsHookEx   failed. ");}private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam){if ((nCode >= 0) && (OnKeyDownEvent != null || OnKeyUpEvent != null || OnKeyPressEvent != null)){KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));//引发OnKeyDownEvent if (OnKeyDownEvent != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)){Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;KeyEventArgs e = new KeyEventArgs(keyData);OnKeyDownEvent(this, e);}//引发OnKeyPressEvent if (OnKeyPressEvent != null && wParam == WM_KEYDOWN){byte[] keyState = new byte[256];GetKeyboardState(keyState);byte[] inBuffer = new byte[2];if (ToAscii(MyKeyboardHookStruct.vkCode,MyKeyboardHookStruct.scanCode,keyState,inBuffer,MyKeyboardHookStruct.flags) == 1){KeyPressEventArgs e = new KeyPressEventArgs((char)inBuffer[0]);OnKeyPressEvent(this, e);}}//引发OnKeyUpEvent if (OnKeyUpEvent != null && (wParam == WM_KEYUP || wParam == WM_SYSKEYUP)){Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;KeyEventArgs e = new KeyEventArgs(keyData);OnKeyUpEvent(this, e);}}return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);}}

对于鼠标钩子的处理:

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;namespace PowerPointTest
{/// <summary> /// 这个类可以让你得到一个在运行中程序的所有鼠标事件 /// 并且引发一个带MouseEventArgs参数的.NET鼠标事件以便你很容易使用这些信息 /// </summary> public class MouseHook{private const int WM_MOUSEMOVE = 0x200;private const int WM_LBUTTONDOWN = 0x201;private const int WM_RBUTTONDOWN = 0x204;private const int WM_MBUTTONDOWN = 0x207;private const int WM_LBUTTONUP = 0x202;private const int WM_RBUTTONUP = 0x205;private const int WM_MBUTTONUP = 0x208;private const int WM_LBUTTONDBLCLK = 0x203;private const int WM_RBUTTONDBLCLK = 0x206;private const int WM_MBUTTONDBLCLK = 0x209;//全局的事件 public event MouseEventHandler OnMouseActivity;static int hMouseHook = 0; //鼠标钩子句柄 //鼠标常量 public const int WH_MOUSE_LL = 14; //mouse hook constant HookProc MouseHookProcedure; //声明鼠标钩子事件类型. //声明一个Point的封送类型
        [StructLayout(LayoutKind.Sequential)]public class POINT{public int x;public int y;}//声明鼠标钩子的封送结构类型
        [StructLayout(LayoutKind.Sequential)]public class MouseHookStruct{public POINT pt;public int hWnd;public int wHitTestCode;public int dwExtraInfo;}//装置钩子的函数 [DllImport("user32.dll ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);//卸下钩子的函数 [DllImport("user32.dll ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern bool UnhookWindowsHookEx(int idHook); //下一个钩挂的函数 [DllImport("user32.dll ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);/// <summary> /// 墨认的构造函数构造当前类的实例. /// </summary> public MouseHook(){//Start();
        }//析构函数. ~MouseHook(){Stop();}public void Start(){//安装鼠标钩子 if (hMouseHook == 0){//生成一个HookProc的实例. MouseHookProcedure = new HookProc(MouseHookProc);hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);//如果装置失败停止钩子 if (hMouseHook == 0){Stop();throw new Exception("SetWindowsHookEx failed. ");}}}public void Stop(){bool retMouse = true;if (hMouseHook != 0){retMouse = UnhookWindowsHookEx(hMouseHook);hMouseHook = 0;}//如果卸下钩子失败 if (!(retMouse)) throw new Exception("UnhookWindowsHookEx failed. ");}private int MouseHookProc(int nCode, Int32 wParam, IntPtr lParam){//如果正常运行并且用户要监听鼠标的消息 if ((nCode >= 0) && (OnMouseActivity != null)){MouseButtons button = MouseButtons.None;int clickCount = 0;switch (wParam){case WM_LBUTTONDOWN: button = MouseButtons.Left; clickCount = 1; break;case WM_LBUTTONUP: button = MouseButtons.Left; clickCount = 1; break;case WM_LBUTTONDBLCLK: button = MouseButtons.Left; clickCount = 2; break;case WM_RBUTTONDOWN: button = MouseButtons.Right; clickCount = 1; break;case WM_RBUTTONUP: button = MouseButtons.Right; clickCount = 1; break;case WM_RBUTTONDBLCLK: button = MouseButtons.Right; clickCount = 2; break;}//从回调函数中得到鼠标的信息 MouseHookStruct MyMouseHookStruct = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));MouseEventArgs e = new MouseEventArgs(button, clickCount, MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y, 0);OnMouseActivity(this, e);}return CallNextHookEx(hMouseHook, nCode, wParam, lParam);}}
}

VSTO Office二次开发应用程序键盘鼠标钩子相关推荐

  1. [转]VSTO Office二次开发应用程序键盘鼠标钩子

    可能在使用VSTO技术对Office的相关程序进行操作时,会碰到用程序去控制一些快捷键的操作,可以对键盘进行挂钩,此时使用P/Invoke函数实现. 原文链接:<VSTO应用程序中加入键盘钩子& ...

  2. VSTO Office二次开发键盘鼠标钩子使用整理

    VSTO Office二次开发键盘鼠标钩子使用整理 可能通过程序控制键盘的操作和控制鼠标的一些操作,网上提供比较多的也是比较好的就是通过钩子(Hook)的方式实现. 简单整理了一下,没有找到很好的程序 ...

  3. VSTO Office二次开发对PPT自定义任务窗格测试

    上篇文章对VSTO Office二次开发操作PPT功能做了简单测试,主要是如何创建一个外接程序并在新建PPT幻灯片时添加自定义文本信息.如何简单自定义任务窗格.如何添加可视化功能区的简单介绍,应该对于 ...

  4. VSTO Office二次开发PPTRibbonX命令操作及对象添加

    VSTO Office二次开发PPTRibbonX命令操作及对象添加 本篇分享对于Power Point中一些命令的操作和对于一些比较常用对象.特殊对象的添加功能. 对于Power Point命令操作 ...

  5. 游戏修改器制作教程二:键盘鼠标钩子

    本教程面向有C\C++基础的人,最好还要懂一些Windows编程知识 代码一律用Visual Studio 2013编译,如果你还在用VC6请趁早丢掉它... 写这个教程只是为了让玩家更好地体验所爱的 ...

  6. Windows应用程序-键盘鼠标事件

    设计一个窗口,在该窗口中练习键盘的响应,要求如下: (1) 单击键盘上的向上箭头时,窗口中显示"You had hitted the up key" (2) 单击<Shift ...

  7. [转]VSTO Office二次开发RibbonX代码结构

    前段时间,碰到对于PPT中控制一些命令的问题,也是很是查找了不少的资料,最后使用的是RibbonX的形式解决的,发现RibbonX也是如此的高效. 文章来自:<细品RibbonX(9):层次分明 ...

  8. cad 二次开发 插入图片_CAD如何加载二次开发程序?

    CAD给我们设计师提供了众多的绘图修改命令,满足了我们一般的绘图应用,但是有时候这些命令应用起来有时候并不太方便,为了使我们的绘图命令更加方便快捷,有时候我们需要加载二次开发程序;例如:lisp.VB ...

  9. 娱乐蓝屏程序, 禁用键盘鼠标, 指定键可恢复

    实现蓝屏的整体思路: 全屏显示, 自编写蓝屏屏幕 禁用鼠标输入, 禁用所有键盘输入后释放指定按键以退出程序 启动线程不断杀死打开的任务管理器进程 启动线程监听等待用户按键的按下, 以完成退出 目前设置 ...

最新文章

  1. ORB_SLAM2源码:ORBmatcher.cc
  2. Java项目:酒店管理系统(java+SSM+jsp+mysql+maven)
  3. 如何看待程序媛们的职场焦虑和未来职业规划?
  4. 敏捷个人:激励   2011-11-26期
  5. Asterisk权威指南/第二章 Asterisk架构
  6. 人人都是程序员的节奏,Python 纳入高考
  7. 一套通用的后台管理系统Base Admin 前端:layui 后端:java
  8. HTTP协议学习---(三)摘要认证
  9. Shell中字符串反转的六大方法
  10. 【马哥教育视频】cacti入门及进阶[已更新至第四段]
  11. scipy.stats —— 概率、随机变量与分布
  12. asp.net 中http协议及相关知识(零碎知识记录)
  13. 介绍下BFC,IFC,GFC和FFC
  14. C#——教务管理系统设计01(20181003)
  15. 晋商消费金融被央行暂停征信系统查询权限
  16. 【渗透测试笔记】之【MSF 信息搜集】
  17. layui table 修改为双击编辑
  18. 计算机网络实验 数据链路4-6章 问答题
  19. Google Play App Store 年度最佳应用及游戏盘点
  20. 滚烫出炉:06中国IT十大财经人物

热门文章

  1. 算法竞赛入门笔记—推荐oj
  2. SlickEdit V21 2016 破解教程,win linux mac
  3. 字符串排序(英文字母从 A 到 Z 排列,不区分大小写;同一个英文字母的大小写同时存在时,按照输入顺序排列)
  4. 西门子200恒压供水梯形图_S7-200 PLC控制的变频调速恒压供水系统设计
  5. R语言使用Metropolis- Hasting抽样算法进行逻辑回归
  6. 应用COMSOL Multiphysics建立裂隙流模型
  7. lucene实现分组统计的方法
  8. 工作中收集的一些捷径网站
  9. Linux系统生成CA证书
  10. 在idea中创建xml文件