注册系统热键
相关的例子:下载>>> 作者: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
下一篇>>>