📄 注册系统热键.txt
字号:
注册系统热键
相关的例子:下载>>> 作者:MaxMax 于2008-3-16上传
--------------------------------------------------------------------------------
By MaxMax
在我们常用的QQ中,有一个系统热键,就是当有人和你说话时,使用 Ctrl+Alt+Z即可弹出对话框。
要实现这个功能主要使用2个API函数:RegisterHotKey 和 UnregisterHotKey。
前者的原型是:
RegisterHotKey Function
功能:定义系统热键
BOOL RegisterHotKey(
HWND hWnd,
int id,
UINT fsModifiers,
UINT vk
);
Parameters
hWnd
[输入]制定接收WM_HOTKEY消息的窗口。
id
[输入]定义热键的标识,不能与其他的标识相同哦~ 定义很多热键的情况下,我们就可以区分到底按下的是哪个热键。应用程序可以使用的范围从0x0000 到0xBFFF. DLL定义范围从 0xC000 到h 0xFFFF 。为了避免共享DLL的热键冲突,DLL中应该使用 GlobalAddAtom 函数来指定热键。
fsModifiers
[输入]指定同uVirtKey一起按下的键。 fsModifiers 可以是下面这些值的组合:
MOD_ALT
ALT键被按下
MOD_CONTROL
CTRL键被按下
MOD_SHIFT
SHIFT键被按下
MOD_WIN
WINDOWS 键被按下. 键盘上这个键是有一个Windows logo的
vk
[输入]指定热键的虚拟键码
它将会在系统中注册一个你定义的控件,触发后会向你的程序发送 WM_HOTKEY 消息。
UnregisterHotKey Function
功能:取消定义的热键
BOOL UnregisterHotKey(
HWND hWnd,
int id
);
这个看起来就简单多了,不做过多的描述。
下面是一个简单的例子,定义了一个 Ctrl+Shift+A 的热键,当按下后,会将程序变为前台程序。
;MASMPlus 代码模板 - 普通的 Windows 程序代码
.386
.Model Flat, StdCall
Option Casemap :None
Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc
includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
include macro.asm
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
idMyHotKey equ 2008 ;随便给一个就好了
.DATA
szClassName db "MASMPlus_Class",0
.DATA?
hInstance dd ?
.CODE
START:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke WinMain,hInstance,NULL,NULL,SW_SHOWDEFAULT
invoke ExitProcess,0
WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
local hWnd :HWND
mov wc.cbSize,sizeof WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
mov wc.lpfnWndProc,offset WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,offset szClassName
invoke LoadIcon,hInst,100
mov wc.hIcon,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
mov wc.hIconSm,0
invoke RegisterClassEx, ADDR wc
invoke CreateWindowEx,NULL,ADDR szClassName,CTXT("http://www.aogosoft.com"),WS_OVERLAPPEDWINDOW,200,200,400,200,NULL,NULL,hInst,NULL
mov hWnd,eax
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0
cmp eax, 0
je ExitLoop
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWin:DWORD,uMsg:DWORD,wParam :DWORD,lParam :DWORD
.if uMsg==WM_CREATE
invoke RegisterHotKey,hWin,idMyHotKey,MOD_CONTROL or MOD_SHIFT,'A' ;定义热键
.elseif uMsg == WM_HOTKEY ;处理热键消息
invoke SetForegroundWindow,hWin
invoke SetFocus,hWin
.elseif uMsg == WM_DESTROY
invoke UnregisterHotKey,hWin,idMyHotKey ;取消定义的热键
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWin,uMsg,wParam,lParam
.endif
ret
WndProc endp
END START
参考:
1.http://msdn2.microsoft.com/en-us/library/ms646309.aspx
--------------------------------------------------------------------------------
欢迎访问AoGo汇编小站:http://www.aogosoft.com/ 下一篇>>>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -