在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 constans
private const int WH_KEYBOARD = 2;
private const int HC_ACTION = 0;
#endregion

delegate 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);
}
}

VSTO应用程序中加入键盘钩子相关推荐

  1. 如何让你的程序避开全局键盘钩子的监视

    原文地址:http://blog.okbase.net/BlueSky/archive/3839.html 一直以来有个疑问,就是如果别人在你的电脑上安装了键盘钩子来监视你的键盘按键动作,我的程序怎么 ...

  2. [c语言]在程序中检测键盘按键

    如何在程序中检测键盘 首先 我们直接上代码 #include <conio.h> #include <stdio.h> int main() { while (1) { swi ...

  3. c语言清除键盘缓冲区函数,C语言程序中清除键盘缓冲区的方法

    第四期2006年12月益阳职业技术学院学报 JournalofYiyangVocationalandTechnicalCollegeNO.4Dec.2006 C语言程序中清除键盘缓冲区的方法 杨长虹 ...

  4. electron快捷键_如何在Electron JS应用程序中添加键盘快捷键?

    electron快捷键 Just like in any other native desktop application, keyboard shortcuts save time and make ...

  5. python在程序中模拟键盘鼠标操作

    Python中模拟键盘和鼠标最著名的模块是:pymouse 和 pykeyboard.一次安装两个模块比较麻烦,而有一个库整合了这两个模块,而且能支持跨平台操作,这个库叫 PyUserInput,通过 ...

  6. 易 键盘读取,识别键盘代码,程序中响应键盘,键盘输入等,详细例子,手把手教会你!

    写桌面程序,通常会需要用到键盘输入,比如,你写一个小小的计算器,也需要键盘快捷输入会比较方便,经过摸索,这里对于易语言响应键盘事件,即易语言读取键盘输入,作比较详细的讲解,希望可以帮助到有需要的朋友. ...

  7. VC/MFC 键盘钩子,代码片断

    在MFC程序中使用键盘钩子来获取按键消息,例程: #include "StdAfx.h" #include "KeyboardHook.h" static HH ...

  8. linux 应用程序 键盘,在基于 Web 的 VNC 应用程序中支持多种键盘布局

    基于 Web 的 KVM 管理工具(比如 Kimchi 和 Ovirt)可帮助用户轻松创建和管理虚拟机 (VM),甚至是从移动设备创建和管理虚拟机.这些工具依靠远程桌面共享技术,比如 虚拟网络计算 ( ...

  9. 利用键盘钩子捕获Windows键盘动作

    引言 在科研生产中对研制.调试操作的记录是非常有必要而且是有很重要价值的.通过对记录信息的分析,可以在事故发生后准确的分析出事故的起因.操作是否存在失误等许多重要线索.通常需要记录的信息是多种多样的, ...

最新文章

  1. 全栈AI工程师指南,DIY一个识别手写数字的web应用
  2. Android学习--------实现增删改查数据库操作以及实现相似微信好友对话管理操作...
  3. 服务器 kvm 进入系统,服务器CAT5 KVM切换器系统
  4. [算法题] Add Two Numbers
  5. 凭借识别人的情绪,他们做到了2000多万用户、1000多万订单
  6. h5 socket.io java,从HTML5 WebSocket到Socket.io
  7. 物联网协议Coap协议介绍
  8. 链式运动JavaScript实现
  9. 使用SAP云平台portal service的site manager创建portal实例
  10. Linux线程编程之生产者消费者问题【转】
  11. 自建服务器解网络锁,掌握iPhone1-4代刷机技巧
  12. afp专用计算机,FRM考试只能用这些金融计算器(内含用法功能全解读)
  13. 【计算机网络】网络安全 : 对称密钥分配 ( 密钥分配 | 密钥分配中心 KDC | 对称密钥分配 | 密钥分配协议 | Kerberos 协议 )
  14. PreparedStatement使用
  15. 用动画做出一个正方体并且3d旋转,详解
  16. python根据时间序列画折线图_时间序列模型的python实现
  17. java计算机毕业设计家教平台系统源码+mysql数据库+系统+lw文档+部署
  18. Bootstrap里的圆角outline
  19. 更聪明的免费图片素材搜素引擎 Everypixel 用 AI 排除俗气照片
  20. 【WebGIS】二、基于Openlayers实现地图的加载与显示

热门文章

  1. 华为云服务怎么弄金卡会员_万科牵手华为终端云服务,共建松山湖智慧商圈
  2. mysql+odbc+ado_MFC ado+mysql+odbc技术分享
  3. c语言程序设计移动字母,C语言程序设计模拟试题二(含答案)
  4. c从oracle到mysql移植_数据库从oracle移植到mysql时需要进行的修改
  5. cron 每10分钟执行一次_早餐儿子最爱它,简单卷一卷,10分钟做一大盘,三天两头吃一次...
  6. enas 参数共享_CVPR2020 | CARS: 华为提出基于进化算法和权值共享的神经网络结构搜索,CIFAR10上仅需单卡半天...
  7. Session监听器
  8. logisticregression参数_通俗地说逻辑回归【Logistic regression】算法(二)sklearn逻辑回归实战...
  9. java程序面向对象show,20165309 实验二 Java面向对象程序设计
  10. vs写c语言能用scanf,【PAT编写代码时遇到的问题】vs中使用scanf(%c,x);