Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2011, 16:47   #1
AlphaGh0St
 
Регистрация: 25.10.2011
Сообщений: 4
Вопрос FASM передвинуть курсор мыши

Всем привет!
Препод дал не большое задание: написать программку на fasm, которая передвигает курсор мыши на нажатию на одну из клавиш-стрелок.
Например, нажали клавишу "вверх", курсор мыши передвинулся вверх.

По идее, всё просто:
- в бесконечном цикле ожидаем нажатие клавиши.
- определяем, какая из клавиш-стрелок была нажата.
- суммируем/вычитаем текущие координаты курсора в соответствии с нажатой клавишей и переводим курсор на новую позицию.

Просто в теории, в реализации чуть сложнее.
- Подскажите, как определить, какая клавиша была нажата?
- Если не ошибаюсь, для установки координат курсора используется функция setCursorPos, можно пример её использования?
AlphaGh0St вне форума Ответить с цитированием
Старый 25.10.2011, 18:35   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от AlphaGh0St Посмотреть сообщение
- Подскажите, как определить, какая клавиша была нажата?
банально, но факт, через хуки
rpy3uH вне форума Ответить с цитированием
Старый 25.10.2011, 19:16   #3
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

Перехват нажатия клавиши.
На сколько я понимаю можно через int 16h, это сервис БИОС для работы с клавиатурой.
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 25.10.2011, 20:44   #4
AlphaGh0St
 
Регистрация: 25.10.2011
Сообщений: 4
По умолчанию

Я не силён в низкоуровневом программировании и ассемблере, потому и создал тему.
Не могли бы вы подробнее рассказать о перехватах нажатых клавиш?
AlphaGh0St вне форума Ответить с цитированием
Старый 25.10.2011, 23:59   #5
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

Код:
mov ah,10h            ;запрашивает ввод с клавиатуры
int 16h
после этого в ah находиться скан код клавиши нажатой.
в al ascii код .
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 26.10.2011, 10:19   #6
Ang15
Пользователь
 
Регистрация: 02.07.2011
Сообщений: 38
По умолчанию

Asmar, в задании говорится, что нужно двигать курсор мыши, используя системный вызов SetCursorPos. Сл-но, программными bios-прерываниями здесь не обойтись. Т.к. это простая лаба, требуется, скорее всего, создать простое Window-приложение.

Программа, по заказу:
1. показывает, как обрабатывать сообщения
2. показывает, как работает в ассемблере SetCursorPos

Код:
.386p
.model flat,stdcall
includelib c:\assembler\masm6.15\lib\user32.lib
includelib c:\assembler\masm6.15\lib\kernel32.lib
...
WM_CHAR equ 102h
...
extern SetCursorPos@8:near
extern GetMessage@16:near
extern TranslateMessage@4:near
extern DispatchMessage@4:near
...
msgstruct struc
  mshwnd dd ?
  msmessage dd ?
  mswparam dd ?
  mslparam dd ?
  mstime dd ?
  mspt dd ? ; Положение курсора во время посылки сообщения
msgstruct ends
...
data segment dword public use32 'data'
  msg msgstruct <?>
  ...
data ends
code segment dword public use32 'code'
start:
  ...
  ;тот самый бесконечный цикл
msg_loop:
  push 0
  push 0
  push 0
  push offset msg
  call GetMessageA@16
  cmp eax,0
  je end_loop
  push offset msg
  call TranstaleMessage@4
  push offset msg
  call DispatchMessageA@4
  jmp msg_loop
end_loop
  ...
  ;выход из программы
  ...
  ;процедура окна, сюда попадают все сообщения, перехваченные GetMessage
wndproc proc
  push ebp
  mov esp,ebp
  push ebx
  push esi
  push edi
  cmp dword ptr [ebp+0CH],WM_CHAR
  je wmchar
  ...
wmchar:
  cmp dword ptr [ebp+10h],'w'
  je movcursor
  cmp dword ptr [ebp+10h],'W'
  je movcursor
movcursor:
  push 300h
  push 400h
  call SetCursorPos@8
  ...
code ends
end start
В программе, правда, не используется хук (SetWindowHookEx), но сообщение всё-равно обрабатывается.

Правда, код для masm, т.к. fasm не знаю.

Шаблон создания простого 32-разрядного Windows-приложение см. Пирогов. Assembler для Windows.

Программа реагирует на нажатие клавиши W. Можно попробовать через скан-код. Хранится также в сообщение в lParam.

Для 32-разрядных приложений лучше скачать Win32.hlp (описание системных вызовов на английском). Сайт тут небольшой нашёл, глянь туда http://www.vsokovikov.narod.ru/ (то же, только на русском).
Ang15 вне форума Ответить с цитированием
Старый 27.10.2011, 17:03   #7
AlphaGh0St
 
Регистрация: 25.10.2011
Сообщений: 4
По умолчанию

Проблема с получением текущих координат курсора мыши - решена.
Привожу код:
Код:
include 'include/win32ax.inc'

.data
    strMess db 'x: %d; y: %d', 0
    buff db 30 DUP(?)
    pt POINT

.code
    main:
	invoke GetCursorPos, addr pt

        invoke wsprintf, addr buff, addr strMess, [pt.x], [pt.y]
        invoke MessageBox, 0, buff, "mouse", MB_OK

	add [pt.x], 100
        add [pt.y], 100

	invoke SetCursorPos, [pt.x], [pt.y]    

        invoke ExitProcess, 0
    .end main

Последний раз редактировалось AlphaGh0St; 27.10.2011 в 17:16.
AlphaGh0St вне форума Ответить с цитированием
Старый 27.10.2011, 18:49   #8
AlphaGh0St
 
Регистрация: 25.10.2011
Сообщений: 4
По умолчанию

Ну вот и всё, задача решена.
Ниже привожу исходный код.
Всем спасибо за помощь!

Код:
format PE GUI 4.0

include 'include\win32ax.inc'

.data
    _class TCHAR 'FASMWIN32', 0
    _title TCHAR 'Перемещение курсора', 0
    _error TCHAR 'Ошибка создания формы', 0

    wc WNDCLASS 0, WindowProc, 0, 0, 0, 0, 0, COLOR_BTNFACE+1, 0, _class
    msg MSG

    pt POINT

.code
    main:
        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
        test eax, eax
        jz error

        invoke CreateWindowEx, 0, _class, _title, WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU, 128, 128, 360, 200, 0, 0, [wc.hInstance], 0
        test eax, eax
        jz error

        msg_loop:
            invoke GetMessage, msg, 0, 0, 0
            cmp eax, 1
            jb end_loop
            jne msg_loop

            invoke TranslateMessage, msg
            invoke DispatchMessage, msg
            jmp msg_loop

        error:
            invoke MessageBox, 0, _error, 0, MB_ICONERROR+MB_OK

        end_loop:
            invoke ExitProcess, [msg.wParam]

            proc WindowProc hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
            cmp [wparam], VK_UP
            je keyUpPressed

            cmp [wparam], VK_DOWN
            je keyDownPressed

            cmp [wparam], VK_LEFT
            je keyLeftPressed

            cmp [wparam], VK_RIGHT
            je keyRightPressed

            cmp [wmsg], WM_DESTROY
            je wmdestroy

        defwndproc:
            invoke DefWindowProc, [hwnd], [wmsg], [wparam], [lparam]
            jmp finish

        keyUpPressed:
            invoke GetCursorPos, addr pt
            sub [pt.y], 10
            invoke SetCursorPos, [pt.x], [pt.y]
            ret

        keyDownPressed:
            invoke GetCursorPos, addr pt
            add [pt.y], 10
            invoke SetCursorPos, [pt.x], [pt.y]
            ret

        keyLeftPressed:
            invoke GetCursorPos, addr pt
            sub [pt.x], 10
            invoke SetCursorPos, [pt.x], [pt.y]
            ret

        keyRightPressed:
            invoke GetCursorPos, addr pt
            add [pt.x], 10
            invoke SetCursorPos, [pt.x], [pt.y]
            ret

        wmdestroy:
            invoke PostQuitMessage, 0
            xor eax, eax

        finish:
            ret

    endp
    .end main

Последний раз редактировалось AlphaGh0St; 27.10.2011 в 19:16.
AlphaGh0St вне форума Ответить с цитированием
Старый 28.10.2011, 00:41   #9
Ang15
Пользователь
 
Регистрация: 02.07.2011
Сообщений: 38
По умолчанию

GetCursorPos. Не подумал о нём.
Ang15 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Курсор мыши над формой 8adim Общие вопросы Delphi 8 07.02.2011 09:43
Затормаживается курсор мыши в WIndows XP SP3 ENG Ogirinal Altera Windows 2 28.10.2009 13:57
курсор мыши у чужого окна STRELOK-2007 Общие вопросы Delphi 1 06.08.2009 23:17
Курсор мыши gfksx Общие вопросы C/C++ 4 21.04.2009 13:36
Почему не обновляется курсор мыши? HunterMan Win Api 2 06.06.2008 01:39