Привет всем, я пытаюсь заставить окно отвечать на событие когда нажата клавиша Shift, но видимо чтото делаю не правильно, если не трудно подскажите что не так: Code (Text): format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' section '.data' data readable writeable _title db 'Win32 program template',0 _class db 'FASMWIN32',0 _sKeyPressed db 'Shift key is down!!', 0 wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class msg MSG section '.code' code readable executable start: invoke GetModuleHandle,0 mov [wc.hInstance],eax invoke LoadIcon,0,IDI_APPLICATION mov [wc.hIcon],eax invoke LoadCursor,0,IDC_ARROW mov [wc.hCursor],eax invoke RegisterClass,wc invoke CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,128,192,192,NULL,NULL,[wc.hInstance],NULL msg_loop: invoke GetMessage,msg,NULL,0,0 or eax,eax jz end_loop invoke TranslateMessage,msg invoke DispatchMessage,msg jmp msg_loop end_loop: invoke ExitProcess,[msg.wParam] proc WindowProc hwnd,wmsg,wparam,lparam push ebx esi edi cmp [wmsg],WM_DESTROY je wmdestroy ;ЗДЕСЬ: ;=====================================================; xor eax, eax invoke GetKeyState, VK_SHIFT test eax, 80000000h jz ignore invoke MessageBox, NULL, _sKeyPressed, _title, MB_OK ;====================================================== ignore: defwndproc: invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam] jmp finish wmdestroy: invoke PostQuitMessage,0 xor eax,eax finish: pop edi esi ebx ret endp section '.idata' import data readable writeable library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL' include '%fasminc%\apia\kernel32.inc' include '%fasminc%\apia\user32.inc'
хм.. ты знаешь я тоже это заметил, что ШОРТ, но я предварительно залез в нет посмотреть как это другие делают и там именно 80000000h !! в 22 туториале Iczeliona а также на еще одном форуме тоже самое было - и я был уверен что SHORT имеет тоже значение как INT (потому что как я недавно выяснил LONG = INT в си), тогда я только удивляюсь как у Iczeliona работало! А я сейчас переделал как ты предложил и поставил 8000h, все пучком однако!
Наверное так, уфффф стока непоняток, мне короче надо чтобы моя маленькая прога отвечала на нажатие клавиш Ctrl+Shift+(0...9), т.е. например на комбинацию Ctrl+Shift+5, так вот, код свыше работает, а когда я добавиль чтобы отвечала только на клавиши от 0 до 9 не работает, только что я не пробовал! Code (Text): xor eax, eax invoke GetKeyState, VK_SHIFT test eax, 8000h jz .getOut xor eax, eax invoke GetKeyState, VK_CONTROL test eax, 8000h jz .getOut ;=========================дальше не работает, фильтрую от 0...9 xor eax, eax mov eax, dword ptr wParam test eax, '1' jl .getOut xor eax, eax mov eax, dword ptr wParam test eax, '9' jg .getOut (wParam - потому что вообщето эта функция в хуке и она получает клавишные события) полный код DLL выглядит так: Code (Text): format PE GUI 4.0 DLL entry DllEntryPoint include '%fasminc%\win32a.inc' section '.data' data readable writeable shareable sHookInstalled db 'The hook has been installed!', 0 sHookRemoved db 'The hook has been removed!', 0 sHookFailedToInstall db 'Failed to install hook', 0 sKeyPressed db 'Key pressed!', 0 sTitle db 'Title', 0 g_hInstance dd 0 hCurrentHook dd 0 g_bHookSet db FALSE section '.code' code readable executable proc DllEntryPoint, hMod:DWORD, fdwReason:DWORD, lpvReserved:DWORD mov [g_bHookSet], FALSE push [hMod] pop [g_hInstance] mov eax,TRUE ret endp proc InstallHook mov al, [g_bHookSet] cmp al, TRUE je .getOut mov al, TRUE mov [g_bHookSet], al invoke SetWindowsHookEx, WH_KEYBOARD, KbHookProc, [g_hInstance], 0 cmp eax, NULL jne .goOn invoke MessageBox, NULL, sHookFailedToInstall, sTitle, MB_OK jmp .getOut .goOn: mov [hCurrentHook], eax mov [g_bHookSet], TRUE invoke MessageBox, NULL, sHookInstalled, sTitle, MB_OK xor eax, eax .getOut: ret endp proc KbHookProc, nCode:DWORD, wParam:DWORD, lParam:DWORD xor eax, eax mov eax, [nCode] cmp eax, 0 jg .callNextHook xor eax, eax mov eax, dword ptr lParam shr eax, 16 and ax, KF_UP jnz .getOut xor eax, eax mov eax, dword ptr lParam shr eax, 16 and ax, KF_REPEAT jnz .getOut xor eax, eax mov eax, dword ptr lParam shr eax, 16 and ax, KF_EXTENDED jnz .getOut xor eax, eax invoke GetKeyState, VK_SHIFT test eax, 8000h jz .getOut xor eax, eax invoke GetKeyState, VK_CONTROL test eax, 8000h jz .getOut xor eax, eax mov eax, dword ptr wParam test eax, '1' jl .getOut xor eax, eax mov eax, dword ptr wParam test eax, '9' jg .getOut invoke MessageBox, NULL, sKeyPressed, sTitle, MB_OK jmp .getOut .callNextHook: invoke CallNextHookEx, [hCurrentHook], [nCode], [wParam], [lParam] .getOut: ret endp proc RemoveHook xor al, al mov al, [g_bHookSet] cmp al, FALSE je .getOut invoke UnhookWindowsHookEx, hCurrentHook invoke MessageBox, NULL, sHookRemoved, sTitle, MB_OK .getOut: ret endp section '.idata' import data readable writeable library kernel,'KERNEL32.DLL',\ user,'USER32.DLL' import kernel,\ GetLastError, 'GetLastError' import user,\ MessageBox,'MessageBoxA',\ SetWindowsHookEx, 'SetWindowsHookExA',\ UnhookWindowsHookEx, 'UnhookWindowsHookEx',\ CallNextHookEx, 'CallNextHookEx',\ GetKeyState, 'GetKeyState' section '.edata' export data readable export 'VITDLL.DLL',\ InstallHook,'InstallHook',\ RemoveHook,'RemoveHook' section '.reloc' fixups data discardable
Code (Text): mov eax, dword ptr wParam test eax, '1' какой-то странный код я бы переписал так: mov eax, [wParam] cmp al, '1' je ... кстати, отладчик никто не отменял, проверь все-ли правильно отрабатывается
Asterix, leo, вы правы, спасибо. У меня есть определенная неприязнь к дебаггерам но деватся некуда. Теперь работает, дело за малым! Code (Text): xor eax, eax mov eax, dword ptr wParam cmp eax, '1' jl .getOut xor eax, eax mov eax, dword ptr wParam cmp eax, '9' jg .getOut invoke MessageBox, NULL, sKeyPressed, sTitle, MB_OK
По поводу сабжа, пример из мсдн: Code (Text): #define SHIFTED 0x8000 nVirtKey = GetKeyState(VK_SHIFT); if (nVirtKey & SHIFTED){ ... } ; на асме проще invoke GetKeyState,VK_SHIFT test ax,ax jns @F ; shifted .... @@:
Все, получилось, кому интересно может пользоватся прогой с http://www.geocities.com/xlinuks/TransWindows.zip Она умеет изменять прозрачность окон и ставить окно 'always on top', т.е. чтобы была всегда на виду. Всего 4 Кб.