`
lovnet
  • 浏览: 6725505 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

C#调用系统API指定快捷键

 
阅读更多

快捷键的作用大家都清楚,就是快捷嘛,操作起来方便.用电脑的人很少有没用过Ctrl + C 和Ctrl + V的. 其他很多软件也有各种快捷键.电脑自然没那么聪明,知道我们敲哪些键然后给出相应反应,这都得我们自己写代码实现啊.指定快捷键有两种方式.

方法一.当应用程序某个页面获得焦点时,直接写一个该页面的KeyDown事件处理函数就行,非常的简单.我们大多数时候就用的这种快捷键.

方法二.在任何时候都能使用快捷键,此时必须调用系统的API才行.这种情况我们用的不多.不过有个典型的例子,就是通过快捷键切换输入法.输入法的应用程序肯定是通过API处理的.

方法一

我们知道点击鼠标,敲键盘都是触发一个个的事件.那使用快捷键自然是要写个键盘敲击的事件处理函数.我们知道每个控件都可以对应很多事件.所以键盘的的事件处理自然可以和某一个控件关联起来.但一般不怎么样,因为这样的话我们必须得先让此控件获得焦点才行. 而我们很多时候可能希望只要是某个页面打开的情况下,不管焦点在其中的哪个控件上都可以点快捷键键.那我们应该把事件处理与页面(Form)关联起来.假如有页面Form1.对应的事件处理函数如下.

private void Form1_KeyDown(object sender, KeyEventArgs e)

{

if (e.KeyCode == Keys.A) //快捷键a

{

MessageBox.Show("hello arwen");

}

else if (e.KeyCode == Keys.F1) //快捷键F1

{

MessageBox.Show("please help.");

}

else if (e.Control && e.Shift && e.KeyCode == Keys.F) //快捷键Ctrl + Shift + F

{

MessageBox.Show("search some info.");

}

else if (e.Alt && e.KeyCode == Keys.X) //快捷键Alt + X

{

MessageBox.Show("Close.");

}

}

在函数里面可以通过e.KeyCode判断是敲了哪个键.然后做相应的处理就OK.当然你也可以不用e.KeyCode.而是用e.KeyValue来判断,KeyValue就是每个键上面的字母或符号对应的ASCII 码值.

方法二,调用API

调用API最关键的地方就两个

一是调用API函数RegisterHotKey

二是重写函数WndProc.

下面就来看下具体的操作过程

第一步.引用命名空间

using System.Runtime.InteropServices;

添加此命名空间.C#中调用系统API都会用到这玩艺的.

第二步.申明API函数RegisterHotKey

[System.Runtime.InteropServices.DllImport("user32.dll")]

public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint keyValue, Keys vk);

这样声明下就相当于你自己定义了一个函数RegisterHotKey,你只管在其他任意地方调用就行.只是这里看不到函数的实现,相当于是在user32.dll这里面给你实现了.

第三步.调用API函数

第二步已经给你整出个函数了.现在你就像用普通函数一样来用就行.假如就在页面刚加载时就调用此函数吧.

RegisterHotKey(Handle, 888, 2, Keys.F); //指定Ctrl + F为快捷键,并与数字888关联

其中handle是啥句柄之类的,你只管写上,具体不用管.在代码里代不会显式用到它.888是啥呢? 第二步中参数列表可以看到这是id,所谓id就是通过一个数字唯一标志啥嘛.所以这里你随便用个啥数都行的.在后面的函数WndProc函数中会用到这数字. 2是keyValue,不过只有几个特殊键的值.比如Ctrl键对应的是2,Shift键对应的是4,Alt键对应的是1.都定好了的,你不能改.Keys.F就指定任意某个键.你可能会问如果是Ctrl + Shift这样的组合怎么办?很简单两数字直接加起来就行.比如

RegisterHotKey(Handle, 444, 6, Keys.S); //指定Ctrl +Shift+ S为快捷键,并与数字444关联

第四步.重写函数WndProc

前面三步非常好理解.就是调用个API中的函数嘛.虽然麻烦了点,但原理和调用一般函数差不多.但第四步有点难理解.在前面的方法一中我们知道可以通过调用一个事件处理键盘事件就OK.前面三步还没有涉及到事件的概念.那你自然会想到第四步应该是整个事件处理才行啊.的确如此.在这里就是指定一个事件调用的函数.只不过这个函数你看不到是哪里调用了.实际上是操作系统来调用这函数的.原理有点复杂,可能你得去看下C++的消息处理机制才明白.C#的底层那些实现实际上就是用C++写的嘛.

这一步也可以简单的理解为就是对应方法一中的事件处理函数

protected override void WndProc(ref Message m)

{

switch (m.Msg)

{

case 0x0312:

IntPtr id = m.WParam;

switch (id.ToString())

{

case "888": //这里的888就是前面调用函数RegisterHotKey指定的数字

MessageBox.Show("Help me."); break;

case "444":

MessageBox.Show("Search some info."); break;

}

break;

}

base.WndProc(ref m);

}

分享到:
评论

相关推荐

    C#调用系统API指定快捷键的方法

    本文实例讲述了C#调用系统API指定快捷键的方法。分享给大家供大家参考。具体分析如下: 快捷键的作用大家都清楚,就是快捷嘛,操作起来方便.用电脑的人很少有没用过Ctrl + C 和Ctrl + V的. 其他很多软件也有各种快捷键...

    源码发布C#快捷键程序开发

    相当好的快捷键开发设置 源码发布 C#语言 API调用

    C#中通过钩子实现屏蔽组合功能键

    C#中也可以通过调用Win32 API安装和卸载钩子函数,实现基于钩子的特定功能。 本实例为通过C#屏蔽键盘、利用HOOK钩子屏蔽ctrl+alt+delete组合键的示例源码,可直接编译。 示例支持屏蔽按键、解除屏蔽。

    系统热键控制按设定毫秒数于下一秒开始计时模拟鼠标单击(C# 源码)

    将鼠标移至要模拟单击处按热键,于下一秒开始后计时,windowsXP不是实时系统,系统时间误差在20-55ms,而且通过程序获得(特别在CPU占用率高时)都会有延迟,要高精度需要凋API或者取CPU时钟频率,还要计算开机以来...

    简单的C#屏幕锁

    C#写的简单屏幕锁,就是不能阻止Ctrl+Alt+Del快捷键调出任务管理器。不知道怎么调用API函数。

    C#开发典型模块大全

    10.2.2 调用系统API实现鼠标穿透效果 230 10.2.3 修改注册表控制程序开机自启动 231 10.2.4 通过控制窗体透明度实现日历透明显示效果 231 10.2.5 拖动无标题栏窗体 232 10.2.6 将窗体的关闭位置写入到...

    C#开发典型模块大全(光盘)第二部分

    10.2.2 调用系统API实现鼠标穿透效果 10.2.3 修改注册表控制程序开机自启动 10.2.4 通过控制窗体透明度实现日历透明显示效果 10.2.5 拖动无标题栏窗体 10.2.6 将窗体的关闭位置写入到注册表中 10.2.7 将程序图标写入...

    C#微软培训资料

    18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...

    cs热键使用技巧

    cs热键,可使得初学者练习C#调用API编程。同时学习windows的快捷键的C#编程。

    C#开发典型模块大全(光盘)第一部分

    10.2.2 调用系统API实现鼠标穿透效果 10.2.3 修改注册表控制程序开机自启动 10.2.4 通过控制窗体透明度实现日历透明显示效果 10.2.5 拖动无标题栏窗体 10.2.6 将窗体的关闭位置写入到注册表中 10.2.7 将程序图标写入...

    C#开发典型模块大全(光盘)

    10.2.2 调用系统API实现鼠标穿透效果 10.2.3 修改注册表控制程序开机自启动 10.2.4 通过控制窗体透明度实现日历透明显示效果 10.2.5 拖动无标题栏窗体 10.2.6 将窗体的关闭位置写入到注册表中 10.2.7 将程序图标写入...

    ASP升级.net资料大全(c#入门 语言规范 源码教程 学习笔记 技术资料 面试题 asp与.net代码生成器)

    C#调用存储过程.txt CheckBox控件.txt datagrid排序_选择_分页.txt DataSet对象.txt DotNET WinForm FAQ 16个.txt excel打印.txt EXCEL导出.txt EXCEL中合并单元格.txt mail.txt NET在RichTextBox控件加入...

    WPF 使用windows钩子监控键盘

    WPF 使用windows钩子监控键盘,使用windows底层api,封装为c#代码,供wpf见面调用

    .net技术资料大全(语言规范 源码教程 学习笔记 技术资料 .net代码生成器)

    C#调用存储过程.txt CheckBox控件.txt datagrid排序_选择_分页.txt DataSet对象.txt DotNET WinForm FAQ 16个.txt excel打印.txt EXCEL导出.txt EXCEL中合并单元格.txt mail.txt NET在RichTextBox控件加入...

    asp.net知识库

    多样式星期名字转换 [Design, C#] .NET关于string转换的一个小Bug Regular Expressions 完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则表达式 delegate vs. ...

    DOTween.unitypackage

    DOTween是一种快速,高效,完全类型安全的面向对象的动画引擎的团结,以优化C#用户,免费和开源,用吨的先进功能。 DOTween与Unity版本2018至3.5兼容。 适用于: Win,Mac,Linux,Unity WebPlayer,WebGL,...

Global site tag (gtag.js) - Google Analytics