当前位置: 移动技术网 > IT编程>开发语言>c# > C#调用系统API指定快捷键的方法

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

2019年07月18日  | 移动技术网IT编程  | 我要评论
本文实例讲述了c#调用系统api指定快捷键的方法。分享给大家供大家参考。具体分析如下: 快捷键的作用大家都清楚,就是快捷嘛,操作起来方便.用电脑的人很少有没用过ctrl

本文实例讲述了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#程序设计有所帮助。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网