怎样用API定义多个快捷键

南山明月 2003-09-29 11:22:44
那就是无论调用它的程序是在前台还是在后台运行,它都能够检测键盘上某组合键是否被按下(即一旦调该函数,它在整个系统范围内都有效)
...全文
107 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mingtian2008 2003-12-07
  • 打赏
  • 举报
回复
up
online 2003-11-13
  • 打赏
  • 举报
回复
Option Explicit
' 声明API函数
Private Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Private Declare Function UnregisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long) As Long
Private Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" (lpMsg As Msg, ByVal hWnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long, ByVal wRemoveMsg As Long) As Long
Private Declare Function WaitMessage Lib "user32" () As Long
' 声明结构
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type Msg
hWnd As Long
Message As Long
wParam As Long
lParam As Long
time As Long
pt As POINTAPI
End Type
' 声明常数
Private Const MOD_ALT = &H1
Private Const MOD_CONTROL = &H2
Private Const MOD_SHIFT = &H4
Private Const PM_REMOVE = &H1
Private Const WM_HOTKEY = &H312

Private HotKey_Flg As Boolean

Private Sub Form_Load()
Dim Message As Msg

'注册 Ctrl+Shift+I和Ctrl+Shift+K 为热键
RegisterHotKey Me.hWnd, &HBFFF&, MOD_CONTROL + MOD_SHIFT, vbKeyI
RegisterHotKey Me.hWnd, &HBFFA&, MOD_CONTROL + MOD_SHIFT, vbKeyK
Me.Show
'等待处理消息
HotKey_Flg = False
Do While Not HotKey_Flg
'等待消息
WaitMessage
'检查是否热键被按下
If PeekMessage(Message, Me.hWnd, WM_HOTKEY, WM_HOTKEY, PM_REMOVE) Then
'打开计算器程序
Shell "calc.exe", vbNormalFocus
End If
'转让控制权,允许操作系统处理其他事件
DoEvents
Loop
End Sub

Private Sub Form_Unload(Cancel As Integer)
HotKey_Flg = True
'撤销热键的注册
Call UnregisterHotKey(Me.hWnd, &HBFFF&)
End Sub


南山明月 2003-11-13
  • 打赏
  • 举报
回复
怎样用API定义多个快捷键?你只定义了一个快捷键呀
pigpag 2003-10-01
  • 打赏
  • 举报
回复
可以直接运行,千万不要“暂停”程序。十之八九VB6就会突然关掉
rainstormmaster 2003-09-30
  • 打赏
  • 举报
回复
上面的程序使用了SubClassing,调试的时候,记得先存盘,最好编译之后再运行
南山明月 2003-09-29
  • 打赏
  • 举报
回复
使用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的定义取消掉。
aha99 2003-09-29
  • 打赏
  • 举报
回复
给你一个完整的例子
模块:
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 Const ShowHotKey = &H44EE
Public preWinProc As Long
Public Modifiers As Long, uVirtKey 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 = ShowHotKey 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 "
Form1.Show
End If
End If
End If
wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
End Function
窗体:
Option Explicit
Sub Form_Load()
Dim ret As Long
preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)
Modifiers = MOD_ALT + MOD_SHIFT + MOD_CONTROL
uVirtKey = vbKeyZ
ret = RegisterHotKey(Me.hwnd, ShowHotKey, Modifiers, uVirtKey)
Me.Hide
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim ret As Long
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)
Call UnregisterHotKey(Me.hwnd, ShowHotKey)
End Sub

没写注释,自己看看吧
32位汇编级调试器Ollydbg2.01简繁中文版 : Ollydbg2.01版是一个由Oleh Yuschuk2013年9月24发布的32位汇编级调试器,32位汇编级调试器Ollydbg2.01简繁中文版由正思软件工作室翻译发布。 此中间版开始支持插件和自定义快捷键. OllyDbg的是一个32位汇编级Microsoft的Windows的分析调试器。二进制代码分析的重点,特别是在源代码不可用的情况下非常有用。 特别亮点: 直观的用户界面,没有隐藏的命令. 代码分析 - 跟踪寄存器,确认过程,循环,API调用,分支,表,常量和字符串 直接运行和调试的DLL 对象文件扫描 - 从对象文件和库位于例程 允许用户定义的标签,备注和功能描述 识别在Borland ®格式的调试信息 会话之间保存的补丁程序,并将其写入可执行文件,并更新链接地址 开放式架构 - 支持许多第三方插件 无需安装 - 没有注册表或系统目录中的垃圾 调试多线程应用程序 附加到正在运行的程序 配置反汇编器,支持MASM的和IDEAL的格式 MMX,3DNOW!和SSE数据类型和说明,包括速龙Athlon扩展 完整的Unicode支持 动态识别ASCII和Unicode字符串 - 在Delphi格式! 识别复杂的代码结构,如呼叫跳转到程序 解码1900多个标准的API和400 C函数调用 提供来自外部的帮助文件的API函数的上下文敏感的帮助 设置条件,日志记录,内存和硬件断点 跟踪程序的执行,记录已知函数的参数 显示调整信息 动态跟踪堆栈帧 搜索不精确的命令和摸糊的二进制序列 搜索整个分配的内存 查找引用常量或地址范围 审查和修改内存,设置断点和暂停运行方案 组装成二进制形式的最短的命令 从软盘启动 很多,很多!
本书第五版已经经过全面地修订和扩展,涵盖了构建当今Web2.0应用程序所需的JavaScript技术。本书不仅是一本实例驱动的程序员指南,同时也是一本可以摆在桌边随时查阅的参考手册,它以全新的章节阐述了有效使用Javascript脚本所需要知道的一切,包括:
  脚本化的HTTP 和 Ajax;XML处理;使用标记的客户端图形;JavaScript的命名空间——编写复杂程序时所必不可少的;嵌入到Java应用程序中的类、闭包、持久层、Flash和JavaScript 第一部分详细阐述了JavaScript语言的核心内容。如果你是JavaScript新手,它将教授你这门语言;如果你已经是一个JavaScript程序员,第一部分将能磨练你的技艺并加深你对这门语言的理解。 第二部分阐述了在特定浏览器提供的脚本环境下,如何使用JavaScript进行DOM编程。同时运用许多精巧的实例,广泛且深入地阐明了JavaScript如何应用于客户端程序:;为HTML文档生成表格内容;展示DHTML的活力;自动化表单验证;绘制动态饼状统计图;创建可拖曳的HTML元素;为Web应用程序定义键盘快捷键;创建有Ajax特性的工具提示;在Ajax应用中使用XPath和XSLT加载XML文档对象;以及更多 第三部分全面介绍了JavaScript语言的核心。讲述了在JavaScript 1.5和ECMAScript version 3中定义的每一个类、对象、构造器、方法、函数、属性和常量。 第四部分是关于客户端JavaScript的详细参考,涵盖了遗留的Web浏览器API、标准DOM2 API以及新兴的标准,例如XMLHttpRequest对象和标记。本书已经成为全球超过300,000的JavaScript程序员构建JavaScript应用程序不可或缺的参考书籍。

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧