Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Assembler > Регистрация глобального хоткея


Автор: Majestio 16.02.24, 05:23
Всем прива!

В проге нужно зарегать глобальный хоткей Win Z + Z. Нужен хелп:

1) Проверить, не занят ли этот хоткей
2) Как повесить обработчик на него

Советы не нужны. Нужны примеры кода для fasm :rolleyes:

ЗЫ: Вопросы для M$ Windows, но если будут решения для X11, в частности для xfce4, я буду еще более благодарен!

Автор: macomics 16.02.24, 07:18
Вот это? Стандартный пример из fasm1 WIN64/OPENGL
Добавил регистрацию HotKey, обработку и освобождение.
Или вам надо, чтобы приложение запускалось по этой HotKey?
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ; OpenGL programming example
     
    format PE64 GUI 5.0
    entry start
     
    include 'win64a.inc'
     
    include 'opengl.inc'
     
    MOD_WIN      = 0x0008
    MOD_NOREPEAT = 0x4000
     
    section '.text' code readable executable
     
      start:
            sub     rsp,8           ; Make stack dqword aligned
     
            invoke  GetModuleHandle,0
            mov     [wc.hInstance],rax
            invoke  LoadIcon,0,IDI_APPLICATION
            mov     [wc.hIcon],rax
            invoke  LoadCursor,0,IDC_ARROW
            mov     [wc.hCursor],rax
            invoke  RegisterClass,wc
            invoke  CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_OVERLAPPEDWINDOW+WS_CLIPCHILDREN+WS_CLIPSIBLINGS,16,16,432,432,NULL,NULL,[wc.hInstance],NULL
     
      msg_loop:
            invoke  GetMessage,addr msg,NULL,0,0
            cmp     eax,1
            jb      end_loop
            jne     msg_loop
            invoke  TranslateMessage,addr msg
            invoke  DispatchMessage,addr msg
            jmp     msg_loop
     
      end_loop:
            invoke  ExitProcess,[msg.wParam]
     
    proc WindowProc uses rbx rsi rdi, hwnd,wmsg,wparam,lparam
            mov     [hwnd],rcx
            frame
            cmp     edx,WM_SIZE
            je      .wmsize
            cmp     edx,WM_PAINT
            je      .wmpaint
            cmp     edx,WM_KEYDOWN
            je      .wmkeydown
            cmp     edx,WM_HOTKEY
            jz      .wmhotkey
            cmp     edx,WM_DESTROY
            je      .wmdestroy
            cmp     edx,WM_CREATE
            je      .wmcreate
      .defwndproc:
            invoke  DefWindowProc,rcx,rdx,r8,r9
            jmp     .finish
      .wmcreate:
            invoke  GlobalAddAtom, addr szHotKeyName
            mov     [wHotKeyId], ax
            invoke  RegisterHotKey, [hwnd], [wHotKeyId], MOD_WIN or MOD_NOREPEAT, 0x5A
            invoke  GetDC,rcx
            mov     [hdc],rax
            lea     rdi,[pfd]
            mov     rcx,sizeof.PIXELFORMATDESCRIPTOR shr 3
            xor     eax,eax
            rep     stosq
            mov     [pfd.nSize],sizeof.PIXELFORMATDESCRIPTOR
            mov     [pfd.nVersion],1
            mov     [pfd.dwFlags],PFD_SUPPORT_OPENGL+PFD_DOUBLEBUFFER+PFD_DRAW_TO_WINDOW
            mov     [pfd.iLayerType],PFD_MAIN_PLANE
            mov     [pfd.iPixelType],PFD_TYPE_RGBA
            mov     [pfd.cColorBits],16
            mov     [pfd.cDepthBits],16
            mov     [pfd.cAccumBits],0
            mov     [pfd.cStencilBits],0
            invoke  ChoosePixelFormat,[hdc],addr pfd
            invoke  SetPixelFormat,[hdc],eax,addr pfd
            invoke  wglCreateContext,[hdc]
            mov     [hrc],rax
            invoke  wglMakeCurrent,[hdc],[hrc]
            invoke  GetClientRect,[hwnd],addr rc
            invoke  glViewport,0,0,[rc.right],[rc.bottom]
            invoke  GetTickCount
            mov     [clock],eax
            xor     eax,eax
            jmp     .finish
      .wmsize:
            invoke  GetClientRect,[hwnd],addr rc
            invoke  glViewport,0,0,[rc.right],[rc.bottom]
            xor     eax,eax
            jmp     .finish
      .wmpaint:
            invoke  GetTickCount
            sub     eax,[clock]
            cmp     eax,10
            jb      .animation_ok
            add     [clock],eax
            invoke  glRotatef,float [theta],float dword 0.0,float dword 0.0,float dword 1.0
          .animation_ok:
            invoke  glClear,GL_COLOR_BUFFER_BIT
            invoke  glBegin,GL_QUADS
            invoke  glColor3f,float dword 1.0,float dword 0.1,float dword 0.1
            invoke  glVertex3d,float -0.6,float -0.6,float 0.0
            invoke  glColor3f,float dword 0.1,float dword 0.1,float dword 0.1
            invoke  glVertex3d,float 0.6,float -0.6,float 0.0
            invoke  glColor3f,float dword 0.1,float dword 0.1,float dword 1.0
            invoke  glVertex3d,float 0.6,float 0.6,float 0.0
            invoke  glColor3f,float dword 1.0,float dword 0.1,float dword 1.0
            invoke  glVertex3d,float -0.6,float 0.6,float 0.0
            invoke  glEnd
            invoke  SwapBuffers,[hdc]
            xor     eax,eax
            jmp     .finish
      .wmhotkey:
            invoke  MessageBox, HWND_DESKTOP, "Hello", addr _title, MB_OK
            jmp     .finish
      .wmkeydown:
            cmp     r8d,VK_ESCAPE
            jne     .defwndproc
      .wmdestroy:
            invoke  wglMakeCurrent,0,0
            invoke  wglDeleteContext,[hrc]
            invoke  ReleaseDC,[hwnd],[hdc]
            invoke  UnregisterHotKey, [hwnd], [wHotKeyId]
            invoke  PostQuitMessage,0
            xor     eax,eax
      .finish:
            endf
            ret
    endp
     
    section '.data' data readable writeable
     
      _title db 'OpenGL example',0
      _class db 'FASMOPENGL32',0
      szHotKeyName db 'Win+Z hot key', 0
     
      theta GLfloat 0.6
     
      wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,NULL,NULL,_class
     
      hdc dq ?
      hrc dq ?
     
      msg MSG
      rc RECT
      pfd PIXELFORMATDESCRIPTOR
     
      clock dd ?
     
      wHotKeyId dw ?
     
    section '.idata' import data readable writeable
     
      library kernel,'KERNEL32.DLL',\
              user,'USER32.DLL',\
              gdi,'GDI32.DLL',\
              opengl,'OPENGL32.DLL'
     
      import kernel,\
             GetModuleHandle,'GetModuleHandleA',\
             GetTickCount,'GetTickCount',\
             GlobalAddAtom, 'GlobalAddAtomA',\
             ExitProcess,'ExitProcess'
     
      import user,\
             MessageBox, 'MessageBoxA',\
             RegisterHotKey, 'RegisterHotKey',\
             UnregisterHotKey, 'UnregisterHotKey',\
             RegisterClass,'RegisterClassA',\
             CreateWindowEx,'CreateWindowExA',\
             DefWindowProc,'DefWindowProcA',\
             GetMessage,'GetMessageA',\
             TranslateMessage,'TranslateMessage',\
             DispatchMessage,'DispatchMessageA',\
             LoadCursor,'LoadCursorA',\
             LoadIcon,'LoadIconA',\
             GetClientRect,'GetClientRect',\
             GetDC,'GetDC',\
             ReleaseDC,'ReleaseDC',\
             PostQuitMessage,'PostQuitMessage'
     
      import gdi,\
             ChoosePixelFormat,'ChoosePixelFormat',\
             SetPixelFormat,'SetPixelFormat',\
             SwapBuffers,'SwapBuffers'
     
      import opengl,\
             wglCreateContext,'wglCreateContext',\
             wglMakeCurrent,'wglMakeCurrent',\
             wglDeleteContext,'wglDeleteContext',\
             glClear,'glClear',\
             glBegin,'glBegin',\
             glViewport,'glViewport',\
             glRotatef,'glRotatef',\
             glColor3f,'glColor3f',\
             glVertex3d,'glVertex3d',\
             glEnd,'glEnd'

Автор: Majestio 16.02.24, 10:59
Цитата macomics @
Добавил регистрацию HotKey, обработку и освобождение.
Или вам надо, чтобы приложение запускалось по этой HotKey?

Нет нет, нужно действие по хоткею ... Пасип за пример, гляну поразбираюсь.

Автор: macomics 16.02.24, 12:49
По сути из всего примера надо вот это:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
            cmp     edx,WM_HOTKEY ; строка 48 - переход на обработку соответствующего сообщения
            jz      .wmhotkey
    ; ...
            invoke  GlobalAddAtom, addr szHotKeyName ; строка 58 - по сообщению wm_create регистрация горячей клавиши
            mov     [wHotKeyId], ax
            invoke  RegisterHotKey, [hwnd], [wHotKeyId], MOD_WIN or MOD_NOREPEAT, 0x5A
    ; ...
      .wmhotkey: ; строка 114 - обработка сообщения от горячей клавиши (т.к. она одна, то я не распознавал её, подробности в wparam и lparam)
            invoke  MessageBox, HWND_DESKTOP, "Hello", addr _title, MB_OK
            jmp     .finish
    ; ...
            invoke  UnregisterHotKey, [hwnd], [wHotKeyId] ; строка 124 - по сообщению wm_destroy необходимо отключить горячую клавишу
    ; ...
      szHotKeyName db 'Win+Z hot key', 0 ; строка 136 - произвольная строка наименования горячей клавиши (добавляется через GlobalAddAtom)
    ; ...
      wHotKeyId dw ? ; строка 151 - hAtom строки описания горячей клавиши
    ; ...
            GlobalAddAtom, 'GlobalAddAtomA',\ ; строка 136 - добавление импорта функции из kernel32.dll
    ; ...
            RegisterHotKey, 'RegisterHotKey',\ ; строка 168 - добавление импорта функции из user32.dll
            UnregisterHotKey, 'UnregisterHotKey',\

Автор: macomics 16.02.24, 15:05
Цитата Majestio @
но если будут решения для X11, в частности для xfce4

Для этого можно использовать XCB -- xcb_grab_key или Xlib -- XGrabKey
Смотря что у вас там под xfce установлено. Но вообще должно работать как через Xlib так и через XCB

Пример для них поищу, но с 0 писать долго - нету хэадеров для fasm1.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)