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

定义全局热键-VB资料

HTML文档下载 WORD文档下载 PDF文档下载
定义全局热键-VB资料

按下某组键(HotKey)便执行某程式
在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。
'以下在.Bas
Option 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



雅虎11亿美元押注Tumblr三大因素:用户、社交、内容 Perceptual:英特尔感知计算挑战赛 正式启动 吴义坚:创业去!我用深度神经网络,处理语音识别 浅谈用户体验的“反面模式 可穿戴设备又一站:增强现实眼镜CastAR 数字医疗投资将破纪录 投资人看好这些细分领域 Mayer又下一城:雅虎收购Tumblr推进移动化? 前端开发利器:代码预处理工具Prepros 一个轻量级的JavaScript库:Reactor.js [探讨] 用户体验设计师现在面临怎样的机遇和挑战? PPT集萃(二):淘宝、CloudStack等分享的架构经验与最佳实践 2013中国云计算榜单之二:64家云主机+云存储,错综复杂! 看Java技术基础的eBay如何评价他们的Node.js首次尝鲜 Jolla发布首款Sailfish系统手机 无缝兼容Android应用 NPD:全球智能手机出货量2013年将首次超过功能手机 聚合数据左磊:不走寻常路 做国内最好的数据聚合平台 从程序员到软件商 需要注意些什么? 共享软件海外营销策略与实战(上海站) 直接拿来用!最火的Android开源项目(完结篇) 一步加入云生态系统 参加第五届中国云计算大会的十大理由 传苹果iOS7将深度整合Flickr 用户受益最大 Chrome 27来了:页面加载快5% 可同步数据到Google Drive 微软发布新一代游戏主机Xbox One 搭配全新Kinect 2.0体感系统 Unity游戏引擎向iOS与Android开发者免费 Twitter获“下拉刷新”专利 开发者仍可自由使用 复杂产品的响应式设计【流程篇】 使用Javassist库为Bytecode Instrumentation开发JVM Agent 内容解析创业公司Stremor推出4款API 2013中国云计算榜单之三:174家云应用服务商,繁花似锦! 盘点各大云服务提供商:麦当劳=AWS,汉堡王=? BlackBerry Jam亚洲开发者大会9月将在香港开幕 请问在c#如何把char转换为相应byte[](中英文混合) 请高手帮忙------怎样读取sql server 中类型为ntext的数据并显示在页面上?? 请问如何用VB script写一个telnet 登录脚本? 谁有《Active Server Page & Web 数据库》的范例? 关于C++ 有关数据库方面的问题! 如果判断两个用户连接同一张表,而让同一时刻只让一个用户访问???求救 请问use case描述中的扩展点是什么意思?谁给我诠释诠释!100分送上!不够再加! XX去桂林…不能同去,不爽散分儿! 交流VB 放假了,各位兄弟帮帮忙吧。改了ip,不能建立新的数据库了。 急切求教:关于sql全文检索 如何在状态条中动态显示字幕 请教高手:关于定时/计数器 如何在WIN98下面安装WIN2000双启动,需注意什么? 简单问题,在线等 jsp打印设置 scriptx 怎么用lotus script打开一个表单 交流VB Microsoft Windows 2000 Professional 如何安装终端服务? adsi建的邮箱,用outlook连接exchange必须输入username@domain.com格式的帐号才能登陆,请问怎么解决? 如何实现一个任意长度的C++整型类? 一个关于ADO连接,打印报表的问题. Microsoft Windows 2000 Professional 如何安装终端服务? 从注册表中读信息 100分!!为什么我做完fla文件后,生成影片时FLASH自动提示把我的文字打散,请问各位怎么解决??? Microsoft Windows 2000 Professional 如何安装终端服务? 一个奇怪的现象:Delete键在TextBox中失灵 怎么样屏蔽键盘上的print screen键? 为什么一调用office就死机? 谁有Ide.sys、cdrom.sys这两个文件和两个文件的原代码啊! 请问: 当J2EE开发C/S模式时,我的C端要不要装J2EE平台啊?(在线等) 局域网中,一些电脑可以PING通局域网内所以电脑的IP,但是网站邻居就是无法查找到? 委托中要求进行参数传递,应该怎样做,谁帮帮我? *>>--谁做过日历以及日历相关-- 如何卸载windows 2003 server,再重新安装windows 2000 server? 请问将Interbase中两个Varchar型字段连接起来的查询语句怎么写? 域名设置问题?? 为什么微波和X光能穿透介质,而波长介于它们之间的可见光恰不能? 生成EXE问题! Transaction Data Module 和 ADO 问题 寻求DOMINO SERVER 得配置资料!如HTTP的配置等等。 怎么创建dll?创建dll时参数应该怎么定义?创建后怎么调用?在哪儿声明? 熟悉ADODB.Stream的大侠看过来! 在WIN32 CONSOLE APPLICATION 建立的程序中为什么不能使用CString 类 数据库恢复的简单问题 谁用过jfreereport或jaxperreport做过报表?各位大哥帮忙呀!!!--就20分了 紧急高分求助:怎么在windows的user control中加一个参数 [求助]怎样让工程加入Data Report ,菜单 工程 里没有添加Data Report 的呀? 倡导成产手机爱好者与自由开发者协会 CPU拨了会不会叫的啊。内存和显卡拨了不会有声音,一定是主板有问题吗? 我愿意用一辈子的桃花运,来换一个对的人 为什么不能把眼睛比作星星 天上的星星会眨眼睛还是不会眨眼睛? 禁止玩耍的英文是什么 有没有什么方法能在运算上减少错误啊? 错在什么地方 看看它的计算方式 人们通常是以估算的方式来计算时间的,这句话是对的还是错的?速求,没时间了! 马尾松的作用 每逢下雨,蜗牛会躲进壳里,进入梦乡.这句话哪里拟人了?再仿写一个拟人句. 过氧根氧显负一价,但不是说构成非极性共价键的原子不显电性吗? 啊是几声的?如题 46名中国与印度非法采金者在加纳被捕律师称斯诺登将从11月起在俄大型网站美国曾要求日本修宪 欲促日帮忙越战奥巴马医改网站安全漏洞细节曝光 内测联合国计划成立预警机构 防范小行星撞俄罗斯称政府内部系统可防止领导人电话日本解密文件称日本曾希望拥有核武器 律师称斯诺登将开始在俄罗斯某大型网站中方严重关切美监听活动报道 要求美方英一座百年恐怖古宅 神秘红衣等了主人澳洲使馆被指替美监听亚洲 北京河内均【真相】这50个名牌居然是假洋牌,你Sumsoarl谈由环牧VS奴隶战引【催泪】还没等来春暖花开的季节却只剩刘堂哲:10.16白银高位盘整,晚间可以改变你人生的十大旅行,值得一去电影晚报 l 《华丽上班族》调档、《火影忍者手游迈特凯实战演示视频这个冬天很冷:民间金融业破产了?一位最幸福的男人就是开车带着你的女人环游贝尔:收到了贝帅的祝贺短信关于考试,你一定也是这样的,不信就戳
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘