敬业的IT人 >> 编程开发 >> .Net技术 >> vb.net入门——热键隐藏和显示窗口

vb.net入门——热键隐藏和显示窗口

敬业的IT人 互联网 佚名 2008-5-23 21:16:26

在编写Windows应用程序的时候,很多时候都不可避免地需要用到热键。例如通过热键隐藏、显示程序界面,通过热键响应某个操作等。

下面我们就从最简单的隐藏和呼出程序界面开始,熟悉VB.NET中的热键注册、响应和注销。

首先,我们要熟悉下面的两个API函数RegisterHotKey、UnRegisterHotKey,

RegisterHotKey

函数功能:该函数定义一个系统范围的热键。

函数原型:BOOL RegisterHotKey(HWND hWnd,intid,UINT fsModifiers,UINT vk);

参数:

hWnd:接收热键产生WM_HOTKEY消息的窗口句柄。若该参数NULL,传递给调用线程的WM_HOTKEY消息必须在消息循环中中进行处理。

id:定义热键的标识符。调用线程中的其他热键不能使用同样的标识符。应用功能程序必须定义一个0X0000-0xBFFF范围的值。一个共享的动态链接库(DLL)必须定义一个0xC000-0xFFFF范围的值伯GlobalAddAtom函数返回该范围)。为了避免与其他动态链接库定义的热键冲突,一个DLL必须使用GlobalAddAtom函数获得热键的标识符。

fsModifoers:定义为了产生WM_HOTKEY消息而必须与由nVirtKey参数定义的键一起按下的键。该参数可以是如下值的组合:

MOD_ALT:按下的可以是任一Alt键。MOD_CONTROL:按下的可以是任一Ctrl键。

MOD_SHIFT:按下的可以是任一Shift键。

MOD_WIN:按下的可以是任一Windows按键。这些键可以用Microsoft Windows日志记录下来。

vk:定义热键的虚拟键码。

返回值:若函数调用成功,返回一个非O值。若函数调用失败,则返回值为0。若要获得更多的错误信息,可以调用GetLastError函数。

备注:当某键被接下时,系统在所有的热键中寻找匹配者。一旦找到一个匹配的热键,系统将把WM_HOTKEY消息传递给登记了该热键的线程的消息队列。该消息被传送到队列头部,因此它将在下一轮消息循环中被移去。该函数不能将热键同其他线程创建的窗口关联起来。

若为一热键定义的击键己被其他热键所定义,则RegisterHotKey函数调用失败。

若hWnd参数标识的窗口已用与id参数定义的相同的标识符登记了一个热键,则参数fsModifiers和vk的新值将替代这些参数先前定义的值。

Windows CE:Windows CE 2.0以上版本对于参数fsModifiers支持一个附加的标志位。叫做MOD_KEYUP。

若设置MOD_KEYUP位,则当发生键被按下或被弹起的事件时,窗口将发送WM_HOTKEY消息。

RegisterHotKey可以被用来在线程之间登记热键。

速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:不支持;头文件:winuser.h;库文件:user32.lib。

UnregisterHotKey 

函数功能:该函数释放调用线程先前登记的热键。

函数原型:BOOL UnregisterHotKey(HWND hWnd,int id);

参数:

hWnd:与被释放的热键相关的窗口句柄。若热键不与窗口相关,则该参数为NULL。

id:定义被释放的热键的标识符。

返回值:若函数调用成功,返回值不为0。若函数调用失败,返回值为0。若要获得更多的错误信息,可以调用GetLastError函数。

速查:Windows NT: 3.1及以上版本;Windows:95及以上版本;Windows CE:不支持;头文件:Winuser.h;库文件:user32.lib。

 

好了,上面了解了要用到的两个API函数后,我们就可以在代码中实际应用了。

1、首先定义所需要用到的常量

如图所示,在窗体代码后定义常量和API函数

vb.net入门——热键隐藏和显示窗口(图一)

    ·VB.NET 入门教程

    ·VB.NET图解入门
    ·细说VB.NET
    ·全面剖析VB.NET
    ·VB.NET菜单设计初级入门
    ·VB.NET应用集锦
    ·一个VB.NET的用户登陆页面代码
    ·VB和VB.NET中的XML操作
    ·在VB.NET中怎么实现多窗体同步
    ·VB.NET中访问数据方法大全

代码如下:

Public Const WM_HOTKEY As Integer = &H312

Public Const MOD_ALT As Integer = &H1

Public Const MOD_CONTROL As Integer = &H2

Public Const MOD_SHIFT As Integer = &H4

Public Const GWL_WNDPROC As Integer = (-4)

Public Declare Auto Function RegisterHotKey Lib "user32.dll" Alias "RegisterHotKey" (ByVal hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Boolean

Public Declare Auto Function UnRegisterHotKey Lib "user32.dll" Alias "UnregisterHotKey" (ByVal hwnd As IntPtr, ByVal id As Integer) As Boolean

下面过程是注册Ctrl+T的组合键为组合键,假如注册成功,则返回true,反之注册失败则返回false,我们可以根据返回的结果判断并提醒用户注册的情况。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim isResult As Boolean

isResult=RegisterHotKey(Handle, 0, MOD_CONTROL, Asc("T")) '注册Ctrl+T的组合键

If isResult = False Then

MsgBox("注册热键Ctrl+T失败")

End If

End Sub

如下图运行结果,注册失败

vb.net入门——热键隐藏和显示窗口(图二)
注册失败

[apge]

下面过程为重载WndProc过程,响应热键并处理热键,这里是用来隐藏和显示程序主界面。

Protected Overrides Sub WndProc(ByRef m As Message)

If m.Msg = WM_HOTKEY Then

If Visible Then

Hide()

Else

Show()

End If

End If

MyBase.WndProc(m)

End Sub

最后在关闭窗体的时候释放占用的热键,如果前面注册失败的话,则会出现释放失败的结果。

Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed

Dim isResult As Boolean

isResult=UnRegisterHotKey(Handle, 0)

End Sub

热键还有其它很多方面的应用,掌握了基本的应用后,我们就可以根据需要扩展使用了。

 
粤ICP备06119539号
Copyright CiscoSky.Org,Some Rights Reserved.
Email:me1228#tom.com