
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.87] |
![]() |
|
Сообщ.
#1
,
|
|
|
Всем прива!
В проге нужно зарегать глобальный хоткей Win Z + Z. Нужен хелп: 1) Проверить, не занят ли этот хоткей 2) Как повесить обработчик на него Советы не нужны. Нужны примеры кода для fasm ![]() ЗЫ: Вопросы для M$ Windows, но если будут решения для X11, в частности для xfce4, я буду еще более благодарен! |
Сообщ.
#2
,
|
|
|
Вот это? Стандартный пример из fasm1 WIN64/OPENGL
Добавил регистрацию HotKey, обработку и освобождение. Или вам надо, чтобы приложение запускалось по этой HotKey? ![]() ![]() ; 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' |
Сообщ.
#3
,
|
|
|
Цитата macomics @ Добавил регистрацию HotKey, обработку и освобождение. Или вам надо, чтобы приложение запускалось по этой HotKey? Нет нет, нужно действие по хоткею ... Пасип за пример, гляну поразбираюсь. |
Сообщ.
#4
,
|
|
|
По сути из всего примера надо вот это:
![]() ![]() 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',\ |
Сообщ.
#5
,
|
|
|
Цитата Majestio @ но если будут решения для X11, в частности для xfce4 Для этого можно использовать XCB -- xcb_grab_key или Xlib -- XGrabKey Смотря что у вас там под xfce установлено. Но вообще должно работать как через Xlib так и через XCB Пример для них поищу, но с 0 писать долго - нету хэадеров для fasm1. |