关于全局热键

作者&投稿:敖古 (若有异议请与网页底部的电邮联系)
全局热键 是什么~

热键即快捷键,就是键盘上某几个特殊键组合起来完成一项特定任务。比如del+ctrl+alt在xp下可以打开windows任务管理器。如果热键有冲突,解决的办法就是把其中一个热键改掉。热键能够极大地提高工作效率。
全局热键即按任意键

快捷键就是当这个软件窗口处于活动的状态下可用,不活动的状态下不可用。全局热键就是那个窗口不活动的时候也可用。全局热键的一般有三个键。

1.下面调用全局热键的示例:
激活 3 个热键:(注:SetHotkey 是我自定义的函数)
SetHotkey 1, "Ctrl,112", "Add" 按 Ctrl+F1 激活指定程序
SetHotkey 2, 113, "Add" 按 F2 激活指定程序
SetHotkey 3, "Ctrl+Alt,113", "Add" 按 Ctrl+Alt+F2 激活指定程序
注释:注:关于激活热键后的操作,由自定义函数 SetHotkey 的 KeyId 传送的值来判断
注销 3 个热键:
SetHotkey 1, "", "Del" 退出程序是一定要用上的,不然会导至程序死掉
SetHotkey 2, "", "Del"
SetHotkey 3, "", "Del"
请大家新建一个模块(.bas)文件,自定义 SetHotkey函数及其他,这样在以后的任何程序中只要调用此模块就可以了。
注释:本模块是有关热键操作的
Option Explicit
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private 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
Private Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fskey_Modifiers As Long, ByVal vk As Long) As Long
Private Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long

Const WM_HOTKEY = &H312
Const MOD_ALT = &H1
Const MOD_CONTROL = &H2
Const MOD_SHIFT = &H4
Const GWL_WNDPROC = (-4) 注释:窗口函数的地址

Dim key_preWinProc As Long 注释:用来保存窗口信息
Dim key_Modifiers As Long, key_uVirtKey As Long, key_idHotKey As Long
Dim key_IsWinAddress As Boolean 注释:是否取得窗口信息的判断

Function keyWndproc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

If Msg = WM_HOTKEY Then
Select Case wParam 注释:wParam 值就是 key_idHotKey
Case 1 注释:激活 3 个热键后,3 个热键所对应的操作,大家在其他的程序中,只要修改此处就可以了
MsgBox "aa"
Case 2
MsgBox "bb"
Case 3
MsgBox "cc"
End Select
End If

注释:将消息传送给指定的窗口
keyWndproc = CallWindowProc(key_preWinProc, hwnd, Msg, wParam, lParam)

End Function

Function SetHotkey(ByVal KeyId As Long, ByVal KeyAss0 As String, ByVal Action As String)
Dim KeyAss1 As Long
Dim KeyAss2 As String
Dim i As Long

i = InStr(1, KeyAss0, ",")
If i = 0 Then
KeyAss1 = Val(KeyAss0)
KeyAss2 = ""
Else
KeyAss1 = Right(KeyAss0, Len(KeyAss0) - i)
KeyAss2 = Left(KeyAss0, i - 1)
End If

key_idHotKey = 0
key_Modifiers = 0
key_uVirtKey = 0

If key_IsWinAddress = False Then 注释:判断是否需要取得窗口信息,如果重复取得,再最后恢复窗口时,将会造成程序死掉
注释:记录原来的window程序地址
key_preWinProc = GetWindowLong(Form1.hwnd, GWL_WNDPROC)
注释:用自定义程序代替原来的window程序
SetWindowLong Form1.hwnd, GWL_WNDPROC, AddressOf keyWndproc
End If

key_idHotKey = KeyId
Select Case Action
Case "Add"
If KeyAss2 = "Ctrl" Then key_Modifiers = MOD_CONTROL
If KeyAss2 = "Alt" Then key_Modifiers = MOD_ALT
If KeyAss2 = "Shift" Then key_Modifiers = MOD_SHIFT
If KeyAss2 = "Ctrl+Alt" Then key_Modifiers = MOD_CONTROL + MOD_ALT
If KeyAss2 = "Ctrl+Shift" Then key_Modifiers = MOD_CONTROL + MOD_SHIFT
If KeyAss2 = "Ctrl+Alt+Shift" Then key_Modifiers = MOD_CONTROL + MOD_ALT + MOD_SHIFT
If KeyAss2 = "Shift+Alt" Then key_Modifiers = MOD_SHIFT + MOD_ALT
key_uVirtKey = Val(KeyAss1)
RegisterHotKey Form1.hwnd, key_idHotKey, key_Modifiers, key_uVirtKey 注释:向窗口注册系统热键
key_IsWinAddress = True 注释:不需要再取得窗口信息

Case "Del"
SetWindowLong Form1.hwnd, GWL_WNDPROC, key_preWinProc 注释:恢复窗口信息
UnregisterHotKey Form1.hwnd, key_uVirtKey 注释:取消系统热键
key_IsWinAddress = False 注释:可以再次取得窗口信息
End Select
End Function

该程序在 VB5.0,Win 98 下运行良好

-------------------------------------------------------

2.VB中定义全局热键

发布时间:2005-6-30 8:29:34
信息来源:メ冰枫ぱ雪
第一种:

比如说金山词霸用ctrl+alt+F1可实现开/关取词功能.
怎么做的呢?

bas 模块代码:

'********************************************************
' DECLARATIONS NEEDED TO INTERCEPT WINDOW MESSAGES *
'********************************************************

Public Declare Function SetWindowLong Lib "USER32" Alias
"SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong
As Long) As Long
Public Declare Function CallWindowProc Lib "USER32" Alias
"CallWindowProcA" (ByVal OldwndProc As Long, ByVal hWnd As Long, ByVal wMsg
As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Const GWL_WNDPROC = -4
Public OldwndProc As Long

'********************************************************
' DECLARATIONS NEEDED TO CREATE THE HOTKEY *
'********************************************************

Public Declare Function RegisterHotKey Lib "USER32" (ByVal hWnd As
Long, ByVal HotKeyID As Long, ByVal fsModifiers As Long, ByVal vKey As Long)
As Long
Public Declare Function UnregisterHotKey Lib "USER32" (ByVal hWnd As
Long, ByVal HotKeyID As Long) As Long

Public Const WM_HOTKEY = &H312
Public Const WM_NCDESTROY = &H82

Public Const MOD_ALT = &H1
Public Const MOD_CONTROL = &H2
Public Const MOD_SHIFT = &H4
Public Const MOD_WIN = &H8

Public HotKeyID(12) As Long

Public Function WindowProc(ByVal hWnd As Long, ByVal WindowMsg As
Long, ByVal wParam As Long, ByVal lParam As Long) As Long

'This is where all the messages for this form as directed to
'We will need to check for the WindowMessage WM_HOTKEY
'to see if a hotkey is pressed and then we need
'To check the wParam to see which HotKey (1-12) has been pressed

Select Case WindowMsg
Case WM_HOTKEY
'WM_HOTKEY
'idHotKey = (int) wParam; // identifier of hot key
'fuModifiers = (UINT) LOWORD(lParam); // key-modifier flags
'uVirtKey = (UINT) HIWORD(lParam); // virtual-key code
Select Case wParam
'This is where you put the code you want to start
'whenever someone has pressed a hotkey
Case HotKeyID(1)
MsgBox "Hotkey F1 has been pressed."
Case HotKeyID(2)
MsgBox "Hotkey F2 has been pressed."
Case HotKeyID(3)
MsgBox "Hotkey F3 has been pressed."
Case HotKeyID(4)
MsgBox "Hotkey F4 has been pressed."
Case HotKeyID(5)
MsgBox "Hotkey F5 has been pressed."
Case HotKeyID(6)
MsgBox "Hotkey F6 has been pressed."
Case HotKeyID(7)
MsgBox "Hotkey F7 has been pressed."
Case HotKeyID(8)
MsgBox "Hotkey F8 has been pressed."
Case HotKeyID(9)
MsgBox "Hotkey F9 has been pressed."
Case HotKeyID(10)
MsgBox "Hotkey F10 has been pressed."
Case HotKeyID(11)
MsgBox "Hotkey F11 has been pressed."
Case HotKeyID(12)
MsgBox "Hotkey F12 has been pressed."
End Select
End Select

'No matter what happens we *always* end with the normal
'window procedure to finish/handle the message by
'calling the CallWindowProc.
WindowProc = CallWindowProc(OldwndProc, hWnd, WindowMsg, wParam,
lParam)

End Function

[h4]Form 模块代码:[h4]
'窗体上有12个checkbox控件数组,名字为chkKey.
'一个按钮cmdQUIT,
'代码:
Option Explicit

Dim HotKey As Byte
Dim HotKeyEnabled(12) As Boolean
Dim ClickedBefore As Boolean

Public Sub Cleanup()

For HotKey = 1 To 12
If HotKeyEnabled(HotKey) = True Then
Call DeleteHotkey
End If
Next HotKey

Unload Me

'Don't end with End since this will cause the program to crash
'even if you restored the SetWindowLong property to the OldwndHnd

End Sub

Public Sub CreateHotkey()

Dim ReturnValue As Long

'用户自己指定一个热键标识,一个整型数,范围:
'应用程序: 0x0000 -- 0xBFFF.
'DLL: 0xC000 -- 0xFFFF
'WM_HOTKEY 的 wPara 就是该标识的值

HotKeyID(HotKey) = HotKey

'F1 -- 112
'F2 -- 113
'......

HotKey = HotKey + 111

'Register 一个 HotKey
ReturnValue = RegisterHotKey(hWnd, HotKeyID(HotKey - 111), 0, HotKey)
'hWnd: 哪个窗体将接收 WM_HOTKEY 事件

'fsModifiers可取 :
'0, MOD_ALT, MOD_SHIFT, MOD_CONTROL, MOD_WIN
'HotKey是键码常数(注意不是ASCII码),即 vbKeyF1, vbKeyF2....

End Sub

Public Sub DeleteHotkey()

Dim ReturnValue As Long

'To disable/unload the selected hotkey (index number of the checkbox
'that was clicked on) simply unregister the HotKeyID (from the form it
'was registered to)
ReturnValue = UnregisterHotKey(hWnd, HotKeyID(HotKey))

End Sub

Private Sub chkKEY_Click(Index As Integer)

'A checkbox was clicked. We need to find out if now it is
'checked or not and act accordingly

If chkKEY(Index).Value = 1 Then 'The box that was clicked is now
checked
'so enable the function key as a hotkey.
'We know that index holds the value of the function-key to enable
HotKey = Index
Call CreateHotkey 'Go to the CreateHotKey sub to actually create
the hotkey
HotKeyEnabled(Index) = True
Else 'The box is now unchecked, so we need to disable this hotkey
HotKey = Index
Call DeleteHotkey
HotKeyEnabled(Index) = False
End If

If ClickedBefore = False Then
MsgBox "Now you can press F" & Index & " to see that it acts as a
hotkey." & vbCrLf & _
"If you want you can select more hotkeys.", vbInformation,
App.Title
ClickedBefore = True
End If

End Sub

Private Sub cmdQUIT_Click()

Call Cleanup

End Sub

Private Sub Form_Load()

'回调函数
OldwndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)

End Sub

Private Sub Form_Terminate()

Call Cleanup

End Sub

Private Sub Form_Unload(Cancel As Integer)

Call Cleanup

End Sub

第二种:

按下某组键(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


如何注册全局热键
如何注册全局热键(c++builder)这样吧,我给你一个例程,包括了ResiterHotKey的用法和消息处理的用法,你仔细看看吧。这个程序有一个窗体Form1,Form1上注册了一个热键Ctrl+F11,以后只要这个程序在运行,不管在什么,你一按Ctrl+F11,就会弹出一个消息框。\/\/Unit.H \/\/--- ifndef Unit1H define Unit1...

C#如何设置全局热键?
[System.Runtime.InteropServices.DllImport("user32.dll")] \/\/申明API函数 public static extern bool RegisterHotKey(IntPtr hWnd, \/\/ handle to window int id, \/\/ hot key identifier uint fsModifiers, \/\/ key-modifier options Keys vk \/\/ virtual-key code );第一个参数设置为全局的控件...

易语言全局热键问题
.版本 2 .支持库 shellEx .程序集 窗口程序集1 .程序集变量 热键KID, 整数型 .子程序 _窗口1_创建完毕 热键KID = 注册热键 (取窗口句柄 (), 标签1.取窗口句柄 (), 1, #键1).子程序 _标签1_反馈事件, 整数型 .参数 参数一, 整数型 .参数 参数二, 整数型 .如果真 (参数一 = ...

VC如何实现全局热键
BOOL RegisterHotKey(HWND hWnd , \/\/指定接收WM_HOTKEY消息的窗体句柄 int id, \/\/热键标识,同一调用线程内的不同热键标识不能相同,应用程序中的标识值在0x0000和0xbfff之间,DLL中的在0xc000和0xffff之间 UINT fsModifiers,\/\/下列值的组合:MOD_ALT,MOD_CONTROL,MOD_SHIFT,MOD_WIN,MOD_KEYUP ...

VB全局热键
主窗体代码如下:Option Explicit '程序启动时注册功能热键F12 Private Sub Form_Load()Dim Modifiers As Long preWinProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf WndProc uVirtKey = vbKeyDelete RegisterHotKey Me.hWnd, 1, Modifiers, uVirtKey End...

易语言如何注册全局热键?
.版本 2 .支持库 shellEx .支持库 spec .程序集 窗口程序集1.程序集变量 bis, 整数型, , , 注册到的标识,标签反馈参数的便是这个,每个按键都有固定的标识,用此可判断按下什么 .子程序 __启动窗口_创建完毕 bis = 注册热键 (取窗口句柄 (), 标签1.取窗口句柄 (), 0, #键1).判断...

vb全局热键
End Sub '这样就实现了全局热键的效果,即使程序在后台,按Alt+F1也可以让窗口激活并选中check1 参考资料:http:\/\/zhidao.baidu.com\/question\/59299626.html?si=2

delphi怎样弄全局热键
private aatom:atom;c:atom;procedure hotkey(var msg:tmessage);message wm_hotkey; \/\/定义全局热键消息事件 { Private declarations } public { Public declarations } end;var Form1: TForm1;a,b:integer;implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject);...

关于VB中定义全局热键
在窗体上加入控件Timer1(Interval=100),然后复制下面代码,即可实现上述功能:Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer '增加的代码 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lp...

VB全局热键~~例如我按下Alt+F1某个Check就选中了 不是全局的也行
Modifiers, uVirtKey)End Sub Private Sub Form_Unload(Cancel As Integer)Dim ret As Long ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)Call UnregisterHotKey(Me.hwnd, uVirtKey)End Sub '这样就实现了全局热键的效果,即使程序在后台,按Alt+F1也可以让窗口激活并选中check1 ...

江安县17681966588: 全局热键 是什么 -
丑骂丽珠: 热键即快捷键,就是键盘上某几个特殊键组合起来完成一项特定任务.比如del+ctrl+alt在xp下可以打开windows任务管理器.如果热键有冲突,解决的办法就是把其中一个热键改掉.热键能够极大地提高工作效率. 全局热键即按任意键

江安县17681966588: 快捷键和全局热键有什么区别 -
丑骂丽珠: 快捷键就是当这个软件窗口处于活动的状态下可用,不活动的状态下不可用.全局热键就是那个窗口不活动的时候也可用.全局热键的一般有三个键.

江安县17681966588: 热键怎么使用?全局热键又是什么意思?
丑骂丽珠: 全局热键的使用让你不用看到播放界面即可实现几乎全部功能操作

江安县17681966588: 有谁知道电脑键盘上的热键指的是那个键. -
丑骂丽珠: 热键即快捷键,就是键盘上某几个特殊键组合起来完成一项特定任务.比如del+ctrl+alt在xp下可以打开windows任务管理器.如果热键有冲突,解决的办法就是把其中一个热键改掉.热键能够极大地提高工作效率.

江安县17681966588: 打开qq对话框快捷键 - 打开qq对话框快捷键是什么
丑骂丽珠: 1. 打开qq对话框快捷键是什么1.Alt+S 快速回复2.Alt+C 关闭当前窗口3.Alt+H 打开聊... 第五步:单击“设置热键”——出现“全局热键”窗口界面,打开后拉到最后,选中...

江安县17681966588: 系统中的全局键和ctrl+v之类的快捷键有什么不同?如果不同那全局键指的是什么? -
丑骂丽珠: 全局热键 比如Ctrl+Alt+Del 即不管当前活动窗口是什么,都可以执行快捷键对应的命令 由系统或相对应的软件设置快捷键 作用于当前活动窗口下 由相对应的软件设置

江安县17681966588: 怎么去掉系统全局快捷键? -
丑骂丽珠: 系统设置—基本设置—热键—全局热键—点击你想要取消的快捷热键,再按删除键,就会显示“无”,再按确定键保存设置.这样以后就没有快捷功能了.

江安县17681966588: 热键是什么意思? -
丑骂丽珠: 快捷键,又叫快速键或热键,指通过某些特定的按键、按键顺序或按键组合来完成一个操作,很多快捷键往往与如 Ctrl 键、Shift 键、Alt 键、Fn 键以及 Windows 平台下的 Windows 键和 Mac 机上的 Meta 键等配合使用. 利用快捷键可以代替鼠...

江安县17681966588: 热键是什么?热键的定义是什么?
丑骂丽珠: 热键: 热键即快捷键,就是键盘上某几个特殊键组合起来完成一项特定任务.比如del+ctrl+alt在xp下可以打开windows任务管理器.如果热键有冲突,解决的办法就是把其中一个热键改掉. 使用计算机和软件的最大理由是可以提高工作效率.提高效率的关键,一是佳软,二是善用.熟练掌握热键,乃是高效工作之道的基础和不二法门.下文针对最经典的软件,列举了最实用的快捷键,涉及:操作系统、浏览器、播放器、交流工具、文件管理工具、文本编辑等.要注意的是,相同的全局热键,只能让一个程序生效.

江安县17681966588: VB全局热键 -
丑骂丽珠: 主窗体代码如下:Option Explicit'程序启动时注册功能热键F12 Private Sub Form_Load() Dim Modifiers As Long preWinProc = GetWindowLong(Me.hWnd, GWL_WNDPROC) SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf WndProc ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网