说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

按下某组键(HotKey)便执行某程式-VB资料

HTML文档下载 WORD文档下载 PDF文档下载
按下某组键(HotKey)便执行某程式-VB资料

在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

《近匠》逸创云客服创始人叶翔:做好客服产品静待SaaS大爆发时代的到来 【SDCC2015现场】数据库实战论坛:分布式数据库的实践与挑战 SDCC 2015 中国软件开发者大会亮点回顾 《近匠》扬智科技GoWarrior:软硬件全面开源的计算平台 【CTO讲堂】独家直播双十一全网动态?前黑客“劳改”带你玩转大数据 《近匠》好雨云刘凡:提供全方位支持的一站式开发服务云平台 体验过HTC Vive,才知道何谓沉浸感 BDTC 2015:大数据技术精英云集 初版日程公布(表) 深度剖析C++对象池自动回收技术实现 React Native与ExMobi技术路线探索 SDCC 2015前端专场札记:Facebook、百度、腾讯、美团、饿了么等互联网公司的前端实战 芯片巨头为何痴恋开源软件?英特尔Imad Sousou来解密 3D Touch:岂止于Multi-Touch Atlassian亚太区业务经理Paul Conroy:敏捷是开发者的痛点 基于DuiEngine的开源DirectUI图形界面库SOUI 【CTO讲堂】工具类、新闻类、视频类等不同类型App的积分体系该如何搭建? 浏览器的改进应来自用户诉求而非商业诉求 《近匠》Moxtra:可内嵌的一站式移动协同解决方案 互联网时代的无栈开发 SDCC 2015参会感——无法计算的价值 英特尔中国研究院开放日 多个研究项目齐亮相 阿里王晶昱谈淘宝双11分布式数据库实战 为什么移动化对企业级应用如此重要? 移动App图标设计的最佳实践 在Node应用中实施Web认证的四大方法 如何在Swift中使用LLVM API? 七麦科技王东:搜索优化与数据支撑打破App推广困局 Android国外学习资源汇总 【CTO讲堂】揭秘高效协作工具背后的技术架构 TIOBE 2015年12月编程语言排行榜:Java正处巅峰 “Atlassian—敏捷就这么简单“沙龙在京落幕,百度、京东专家秘技公开 sqlserver有一个带参数的存储过程,为什么不能生成DW.?? 急(送100分):多个image控件如何用imagexxx使用? 如何得到CPU的时钟频率? 各位大佬,0x1 是什么? 一个页面只让一个用户来修改 请问哪儿有Lotus Notes C API的教程?以及要进行编程必须进行哪些配置? PB7连接MSSQLServer6.5的时候为什么需要那么长的时间和占用100多M的内存? 推荐在代理服务器上安装什么邮件网关软件? 在线等待 请各位帮助 如何得到开机时间? 我想把smalldatetime类型显示为“yyyy_mm_dd 00:00:00” 急须一个完全免费的MP3刻录软件 怎样修改xml的节点的值? Tabpage(子项)可以改变颜色,但Tabcontrol(父项)改变不了颜色。高手帮忙。 MM说:“你可真够没良心的!”! (邀请水园MM请参与) 测试流程! 在用ADO时如何判断在所取得的记录中,值为null的的情况 急(送100分):多个image控件如何用imagexxx使用? 关于数组的问题。 Weblogic 死锁的问题 想到亚信去,请各位兄台给点建议!(有分!) 请问能不能用System.Drawing对象在一个页里里画多张图? 索引和自增字段 关于对话框? 求能人?或给思路 请问哪儿有Lotus Notes C API的教程?以及要进行编程必须进行哪些配置? 100分求助:怎麼判斷數據庫服務器存在與否? JUnit重复测试的问题 请问一个hyperlink简单问题 求助:datagrid中控件事件的使用问题? 在C中写文件的内容,在线等待!!! 装了linux后,我的win2000和linux的时间老是都不对了 如果结束会话 如何送分呀? 谁有这个文档的中文资料,谢谢,高分奉送!!! 急!!!请问系统恢复盘的问题! 自定义数据类型如何定义?(数组) dw疑问 请问一下,李维的哪几本书比较好,我有VC基础,想学学DELPHI,望各位给个建议谢谢! jbuild好用吗? 怎样将一个单值的String类型赋给char类型的变量? 哪位有实现(首页 上一页 下一页 末页)的例子? 对话框?求救? 高手看过来,超难问题,高分求解!!!!!分不够,再加~!!! 关于VB中DataGrid控件挂ADO的问题,我想程序中运行时,改变ADO的RecordSoure,并希望DataGrid显示时动态更新? 怎样读懂msdn中的英语 最近我们将用C语言开发一个接口快帮我哦~~~~~~~~~~ 关于socket.setSoTimeout()的问题,请进,请进…… 一个小问题帮我看看该怎样写!!! 百分询问一个问题,哪里有JBUILDER的电子图书下载? 拷贝内存时出现的问题! 西方对叙动武传闻愈演愈烈 叙民众担心潘基文:对于涉历史言论遭日方误解感到津巴布韦一男子因用总统竞选海报当厕纸巴西总统指责美国造成全球“剧烈汇率贬日本设立濒危动物精子库 准备留送外星中国游客增多“炒热”韩国地方机场国际因叙利亚危机国际油价被推至两年来最高东盟防长及会议上中美防长短期内再次会菲格雷多就任巴西新外长德媒:美国暂未决定对叙利亚发起攻击尼日利亚海军击毙6名海盗温州公务接待每餐人均不超60元 官员英国将开放欧洲最大公共图书馆 造价近中高端餐饮经历转型阵痛 月饼市场更有快讯:肯尼亚发生公路交通事故 31人南非华人商城遭抢劫 致两名巴基斯坦人油价创18个月来新高 国内周末或每吨11名马来西亚渔民遭菲持枪歹徒绑架 美官方发言人未回应“投原子弹违反国际张高丽:经济普查数据要实打实不带水分温州瑞安:房屋存在消防隐患的严禁对外男童推车与老人发生摩擦 其父当妻儿面楚天都市报讯 10月19日奥巴马刷卡遭拒付洪湖公安局长带病工作突发脑出血倒在岗图文:埃神破纪录恒大稳登顶图文:埃神破纪录恒大稳登顶地方官员跳楼自杀图文:网游“极品大号”骗倒一众“游戏楚天都市报讯 露姬说了她住的那条街,房东不喜情侣租户女孩舍弃定金退租红楼首次回荡起孙中山原音演说14家单位组团 寻缘楚天之恋热干面变咏叹调?这不是真歌剧图文:粉丝不满意 经纪人也可能丢饭碗图文:爹爹骑车拖她去透析图文:大地为纸水当墨 江滩之上秀地书市民担心老屋成危房武大老校长捐“中学作业”给母校图文:孤寡婆婆有个好“女儿”男子嫌做牙效果不好 十年后放火烧医院张老师的鞭子
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘