文章分类 | 软件分类 | 最新软件 | 杀毒软件 | 实用软件  | MTV下载  | 设为首页 |
  | 下载分类 | 最近更新
您的位置: 首页 >> 文章首页 >> 精文荟萃 >> 教你一招 >>  
教你一招点击TOP10
·左中右3栏布局中最先显示中栏内容的方法2006-2-9 14:55:49
·DOS教学2006-2-5 13:07:32
·快速保存网页中所有图片的方法2006-2-9 20:29:38
·邮箱真的是越大越好吗?2006-2-6 7:49:30
·利用回收站实现特殊功能的三则技巧2006-2-5 21:26:28
·三种办法解决IE浏览器突然关闭2006-2-6 7:49:55
·如何判断电脑故障2006-2-6 6:53:31
·巧用Windows XP刻录CD光盘2006-2-6 7:55:24
·诊断排除基本的 TCP/IP 问题2006-2-9 19:14:23
·复制文件出错的解决办法2006-2-6 0:12:28
精文荟萃点击TOP10
·轻松打造一个漂亮又专业的Flash屏保2006-2-5 13:34:29
·DIY初学者必读 解读CRT显示器的性能参数2006-2-8 18:28:40
·WAP网大全2006-2-9 19:02:47
·“3.15”网站打假专题——中国大陆TOP500网站排行榜(Alexa过滤版)2006-2-9 10:29:26
·DOS教学2006-2-5 13:07:32
·硬盘分区全攻略2006-2-9 10:20:26
·平面设计常用制作尺寸2006-2-5 12:25:24
·2005八种必死网站探密 ----你的网站有这毛病么2006-2-9 20:45:20
·红牌罚下 Google大规模封杀中文作弊网站纪实2006-2-9 16:24:49
·只修改config中一个值 DOOM3速度就提升?2006-2-5 16:40:03

 

按下某组键(HotKey)便执行某程式
作者:我去下载           时间:2006-2-9 20:43:32


在Dos的年代,我们常会以拦截中断向量的方式,做到按下某个hotkey而自动执行某个程式,在Window呢,也可以,不过它是用RegisterHotkey API来完成。


使用RegisterHotkey的概念是,它会定义一组按键的组合,当使用者不管在哪个程式之中,按下Window有注册的HotKey时,OS会传送WM_HOTKEY 的讯息给待接收该讯息的Window,而该Window收到WM_HOTKEY时,便可知道有本身Thread所定义的HotKey被按下,於是可以从wParam, lParam来得知是哪一组HotKey被按下。


RegisterHotKey(

ByVal hwnd As Long , //接收Hotkey的Window

ByVal idHotKey as Long, // identifier of hot key,range 0x0000 through 0xBFFF

ByVal Modifiers As Long, // 定义alt shift control等的组合

ByVal uVirtKey As Long // virtual-key code

)


WM_HOTKEY 叁数的定义

idHotKey = wParam; // identifier of hot key

Modifiers = (UINT) LOWORD(lParam); // key-modifier flags

uVirtKey = (UINT) HIWORD(lParam); // virtual-key code


所以了,除了设定RegisterHotkey外,另要使用SubClassing的技巧才会得知HotKey被按下;最後,程式结束前要使用UnRegisterHotkey将HotKey的定义取消掉。


以下程式功能是:不管在哪个程式中,只要按下ALT-SHIFT-G 便执行NotePad。

'以下在.BasOption Explicit


Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _

(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _

(ByVal hwnd As Long, ByVal nIndex As Long) As Long

Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _

(ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, _

ByVal wParam As Long, ByVal lParam As Long) As Long

Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long

Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long


Public Const WM_HOTKEY = &H312

Public Const MOD_ALT = &H1

Public Const MOD_CONTROL = &H2

Public Const MOD_SHIFT = &H4

Public Const GWL_WNDPROC = (-4)


Public preWinProc As Long

Public Modifiers As Long, uVirtKey As Long, idHotKey As Long


Private Type taLong

ll As Long

End Type


Private Type t2Int

lWord As Integer

hword As Integer

End Type


Public Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, _

ByVal wParam As Long, ByVal lParam As Long) As Long

If Msg = WM_HOTKEY Then

If wParam = idHotKey Then

Dim lp As taLong, i2 As t2Int

lp.ll = lParam

LSet i2 = lp

If (i2.lWord = Modifiers) And i2.hword = uVirtKey Then

Debug.Print "HotKey Shift-Alt-G Pressed "

Shell "notepad", vbNormalFocus

End If

End If

End If

'将之送往原来的Window Procedure

wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)

End Function


'以下在 Form

Sub Form_Load()

Dim ret As Long

preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)

ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)

idHotKey = 1 'in the range &h0000 through &hBFFF

Modifiers = MOD_ALT + MOD_SHIFT

uVirtKey = vbKeyG

ret = RegisterHotKey(Me.hwnd, idHotKey, Modifiers, uVirtKey)

End Sub


Private Sub Form_Unload(Cancel As Integer)

Dim ret As Long

'取消Message的截取,而使之又只送往原来的Window Procedure

ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)

Call UnregisterHotKey(Me.hwnd, uVirtKey)

End Sub

分页:
相关文章:
Copyright© 2005-2006 wqxz.com, All Rights Reserved. 购买虚拟主机请与本站联系