На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> Регистрация глобального хоткея
    Всем прива!

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

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

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

    ЗЫ: Вопросы для M$ Windows, но если будут решения для X11, в частности для xfce4, я буду еще более благодарен!
      Вот это? Стандартный пример из fasm1 WIN64/OPENGL
      Добавил регистрацию HotKey, обработку и освобождение.
      Или вам надо, чтобы приложение запускалось по этой HotKey?
      ExpandedWrap disabled
        ; 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'
        Цитата macomics @
        Добавил регистрацию HotKey, обработку и освобождение.
        Или вам надо, чтобы приложение запускалось по этой HotKey?

        Нет нет, нужно действие по хоткею ... Пасип за пример, гляну поразбираюсь.
          По сути из всего примера надо вот это:
          ExpandedWrap disabled
                    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 -
            Цитата Majestio @
            но если будут решения для X11, в частности для xfce4

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

            Пример для них поищу, но с 0 писать долго - нету хэадеров для fasm1.
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0355 ]   [ 15 queries used ]   [ Generated: 27.04.24, 05:31 GMT ]