⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hotkey.asm

📁 hotkey.rar
💻 ASM
字号:
    .386
    .model flat, stdcall
    option casemap :none   ; case sensitive

    include \masm32\include\windows.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\comctl32.inc
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\comctl32.lib

    LOWORD MACRO bigword
      mov  eax,bigword
      and  eax,0FFFFh 
    ENDM
    HIWORD MACRO bigword
      mov eax,bigword
      shr eax,16
    ENDM     

        WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
        EnumProc PROTO :DWORD,:DWORD
        GetBoxHwnd PROTO :HWND
        
    .data
        dlgname     db "MAIN",0
        szTitle     db "Hot Key Adder",0
        szAbout     db "Coded by: Betrayed",13,10
                    db "Coded in: Assembly(masm)",13,10
                    db "Homepage: http://betrayed.virtualave.net",13,10
                    db "E-mail: odin77@hotmail.com",0
        szProgMan   db "Program Manager",0
        szError     db "Unable to set a hotkey to this window",0
        szNoWin     db "Unable to locate specified window...",0
        
    .data?
        hInstance   dd ?
        hList       dd ?
        hHot        dd ?
        buffer      db 255 dup (?)

    .code

start:

    invoke GetModuleHandle, NULL
        mov hInstance, eax
    invoke DialogBoxParam,hInstance,addr dlgname,0,ADDR WndProc,0
        invoke ExitProcess,eax

WndProc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
    .if uMsg == WM_INITDIALOG
        invoke InitCommonControls                                               ;Loads the common controls so we can use the hotkey control
        invoke SetWindowPos,hWin,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE+SWP_NOMOVE     ;Set on top
        invoke GetDlgItem,hWin,1000                                             ;Get the listbox and store it
            mov hList,eax
        invoke GetDlgItem,hWin,2000                                             ;get the hotkey control and store it
            mov hHot,eax
        invoke EnumWindows,addr EnumProc,NULL                                   ;enum all windows
                mov eax,TRUE                                                    ;return to the dialog
                    ret
    .elseif uMsg == WM_COMMAND
        LOWORD wParam                                                           ;get the id of the control
            .if eax == 3002
                invoke SendMessage,hWin,WM_CLOSE,NULL,NULL
            .elseif eax == 3001
                invoke MessageBox,hWin,addr szAbout,addr szTitle,MB_OK+MB_ICONINFORMATION
            .elseif eax == 3000
                invoke SendMessage,hList,LB_RESETCONTENT,0,0                    ;reset the list
                invoke EnumWindows,addr EnumProc,NULL                           ;Enum the windows
            .elseif eax == 2002                                                 ;remove button
                invoke GetBoxHwnd,hWin                                          ;Get the hwnd of the chose item
                    .if eax != NULL
                        invoke SendMessage,eax,WM_SETHOTKEY,0,0                 ;Get rid of the hotkey
                        invoke SendMessage,hHot,HKM_SETHOTKEY,0,0               ;Set the hot key control to none
                    .endif
            .elseif eax == 2001                                                 ;Set button
                invoke GetBoxHwnd,hWin
                    mov ebx,eax                                                 ;store the handle in ebx
                        .if eax != NULL
                            invoke SendMessage,hHot,HKM_GETHOTKEY,0,0           ;Get the hotkey
                            invoke SendMessage,ebx,WM_SETHOTKEY,ax,0            ;hotkey is return in a word so we use ax instead of eax
                                .if eax != 1                                    ;if it does = one the hotkey did not work
                                    invoke MessageBox,hWin,addr szError,addr szTitle,MB_OK+MB_ICONSTOP
                                .endif
                        .endif
            .elseif eax == 1000                                                 ;listbox
                HIWORD wParam
                    .if eax == LBN_SELCHANGE
                        invoke GetBoxHwnd,hWin
                        .if eax != NULL
                            invoke SendMessage,eax,WM_GETHOTKEY,0,0             ;get the window's hotkey
                            invoke SendMessage,hHot,HKM_SETHOTKEY,ax,0          ;update the hotkey control again using ax instead of eax
                        .endif
                    .elseif eax == LBN_SELCANCEL
                        invoke SendMessage,hHot,HKM_SETHOTKEY,0,0
                    .endif
            .endif
        xor eax,eax
            ret
    .elseif uMsg == WM_CLOSE
        invoke ShowWindow,hWin,SW_MINIMIZE                                      ;eyecandy
        invoke EndDialog,hWin,0
            ret
    .endif
        xor eax, eax
            ret
WndProc endp

EnumProc proc hWnd:DWORD,lParam:LPARAM
LOCAL un:DWORD,dos:DWORD
    invoke GetWindowText,hWnd,addr buffer,255                                   ;Get the windows text
        .if eax         
            invoke IsWindowVisible,hWnd                                         ;see if it is visble
                mov un,eax                                                      ;save result
            invoke lstrcmp,addr buffer,addr szProgMan                           ;We don't want the program manager
                mov dos,eax
            invoke lstrcmp,addr buffer,addr szTitle                             ;Lets not do this window either
                .if !(un == 0 || dos == 0 || eax == 0)                          ;Met our criteria
                        invoke SendMessage,hList,LB_ADDSTRING,0,addr buffer     ;Add to the list
                .endif
        .endif
    mov eax, hWnd
        ret
EnumProc endp

GetBoxHwnd proc hDlg:HWND
    invoke SendMessage,hList,LB_GETCURSEL,0,0                                   ;get list number
        invoke SendMessage,hList,LB_GETTEXT,eax,addr buffer                     ;get the text
            invoke FindWindow,NULL,addr buffer                                  ;find the window
                .if eax == NULL                                                 ;if null the window is no longer there or changed titles
                    invoke MessageBox,hDlg,addr szNoWin,addr szTitle,MB_OK+MB_ICONINFORMATION
                    invoke SendMessage,hDlg,WM_COMMAND,3000,0
                    invoke SetFocus,hList
                .endif
                    ret
GetBoxHwnd endp
end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -