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

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解JavaScript中的this关键字

在JavaScript中this变量是一个令人难以摸清的关键字,this可谓是非常强大,充分了解this的相关知识有助于我们在编写面向对象的JavaScript程序时能够游刃有余。 对于this变量最要的是能够理清this所引用的对象到底是哪一个,也许很多资料上都有自…

NET中使用Identity+CodeFirst+Jwt实现登录、鉴权

目录 前言 一、创建上下文类 1.自定义MyContext上下文类继承IdentityDbContext 2.在Program中添加AddDbContext服务 二、使用Migration数据迁移 1.在控制台中 依次使用add-migration 、updatebase 命令 2.如何修改表名 3.如何自定义字段 三、使用Identity实现登录、修改密码 …

在你们看来,信息网络的定级如何才能更好的发展?或者说有什么影响因素使得定级工作不好开展?

在你们看来,信息网络的定级如何才能更好的发展?或者说有什么影响因素使得定级工作不好开展? 可以从三个层面考虑: (定级工作步骤:定级,备案,建设整改,等级测评,安全监管&…

PHP中文乱码的常见解决方法总结

PHP中文乱码是PHP开发中的常见问题之一。PHP中文乱码有时发生在网页本身,有些产生在于MySQL交互的过程中,有时与操作系统有关。下面进行一番总结。 一.首先是PHP网页的编码 1. php文件本身的编码与网页的编码应匹配 a. 如果欲使用gb2312编码&…

计算机网络技术期末考试复习总结

随便敲的一点复习资料 缩写题 WAN(广域网) LAN (局域网) MAN(城域网) PSE(分组交换器) PAD(分组组装/拆卸设备) NCC(网络控制中心) RT…

LYNC解决方案巡展

今天有幸参加了微软的LYNC解决方案巡展,也捕捉到一些镜头。和大家分享一下。 酒店入口的易拉宝。这个酒店的海鲜自助不错,可惜不是旋转餐厅。 微软中国及大中华区信息工作者业务群峰鹰巩的演讲。不过是纯英文的,没有翻译。我觉得微软在这些方…

计算机网络考试试题库-期末考试题库含答案

一、选择题(第一章 1-10;第二章 11-20;第三章21-35;第四章36-60 ;第五章 61-73道;第六章 74-84道;第七章85-90;第九章91-95;第十章96-100) 1.下列四项内容中,不属于Internet&#x…

Private Inheritance(what, where)

最近在看设计模式的时候,看到了私有继承,发现对这个概念挺模糊的,于是一顿搜索。发现一个不错的解释。红字我做的个人笔记,这是要点。 原文出处:http://tech.163.com/05/1124/14/23B2S17F0009159Q.html 在《C箴言&…

刑法中关于计算机犯罪的规定

1.《中华人民共和国刑法》中关于计算机犯罪的规定有三个条款:   第285条 违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的,处3年以下有期徒刑或者拘役。   第286条 违反国家规定,对计算机信息系统功…

巨额流量费其实可以避免

巨额流量费其实可以避免<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />“史上最贵微博”一度被人们热议。说是运营商的错&#xff0c;而运营商也很无奈&#xff0c;本来这种事情就非运营商所能掌控的。其实天价流量看似可怕其实…

转帖 .Net(C#)纯GDI+绘制实时动态曲线图之二(曲线控件全部源码)

#region 曲线数据显示 #region 绘制背景网格 /// <summary> /// 刷新背景网格线&#xff0c;并返回背景图片&#xff08;背景不判断是否滚动&#xff09; /// </summary> /// <returns>返回背景图片</returns> private System.Drawing.Bitma…

SQL Server语句

SQL简介&#xff1a; 结构化查询语言&#xff0c;全拼 Structured Query Language 主要用于对数据库的操作&#xff0c;大多数据库遵循sql原则 SQL server使用的是sql的扩展集T-SQL 全拼 Transact-SQL SQL组成&#xff1a; SQL由四部分组成分别为DML DDL DQL DCL DML:数据表操…

渗透测试岗位面试题(重点:渗透测试思路)

转载自公众号&#xff1a;alisrc 本文主要是讲解遇到问题的各思路解决方法&#xff0c;不仅可做为面试题查看&#xff0c;在实操中收到思绪的阻碍也可作为参考. 1、拿到一个待检测的站&#xff0c;你觉得应该先做什么&#xff1f;1)信息收集1&#xff0c;获取域名的whois信息,获…

Mysql5.1.36 autoinstall.sh

以下脚本由杨良伟同学一手编写&#xff0c;我只是为了其他文章方便转载才放进自己的文章&#xff0c;以下有附件可以下载&#xff0c;将txt改成sh&#xff0c;赋予执行位&#xff0c;即可执行自动安装&#xff0c;忘转载者标明出处&#xff0c;谢谢。 杨良伟同学blog链接: http…

春晓JAVA的横排和竖排输出

public class ChunXiao {public static void main(String[] args) {String a[][] { { "春", "眠", "不", "觉", "晓", "&#xff0c;" }, { "处", "处", "闻", "啼", &…

Android BroadcastReceiver应用

1. 创建Receiver&#xff0c;两种方式&#xff0c;动态和静态&#xff1a; &#xff08;1&#xff09;静态注册&#xff1a; 首先自定义个Receiver&#xff0c; publicclassMyReceiver extendsBroadcastReceiver { Override publicvoidonReceive(Context context, Intent…

JAVA “百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?

public class BaiYuanBaiJi {public static void main(String[] args) {int x 0, y 0, z 0;//各种鸡的数量 xyz100(只) 5x3yz/3100(元)for (x 0; x < 20; x) {//全部买公鸡&#xff0c;最大是20只for (y 0; y < 33; y) {//全部买母鸡&#xff0c;最大是33只z 100…

mssql 2008恢复xp_cmdshell

EXEC sp_configure show advanced options, 1;RECONFIGURE;EXEC sp_configure xp_cmdshell, 1;RECONFIGURE; 关闭一样.只是将上面的后面的那个"1"改成"0"就可以了. EXEC sp_configure show advanced options, 1;RECONFIGURE;EXEC sp_configure xp_cmdshell…

用数组保存每个月份的天数,输出每个月有多少天。输入一个年份,输出该年份每个月的天数(提醒:闰年二月份多一天)

2、用数组保存每个月份的天数&#xff0c;输出每个月有多少天。 输入一个年份&#xff0c;输出该年份每个月的天数&#xff08;提醒&#xff1a;闰年二月份多一天&#xff09; import java.util.Scanner;public class TianShu {public static void main(String[] args) {int a[…

使用Symantec Altiris 来监控 Dell 服务器 的 硬件

最近一直在折腾DMC 监控 Dell 服务器&#xff0c; Altiris 6 对Dell的监控策略会丰富很多 &#xff0c;到了 7 严重缩水&#xff0c;6的策略又不能转化成7 ~~比较郁闷~~ 唯有自己去写不过最算给我写完了大部分常用的~~ 主要是 电源、电压、风扇、温度、处理器、内存、电池 等等…