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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2011, 17:47   #1
turbovitalik
Новичок
Джуниор
 
Регистрация: 11.09.2011
Сообщений: 2
По умолчанию Обработка нажатия кнопок мыши

Доброго времени суток, многоуважаемые программисты! Появилась необходимость написать программу, реагирующую на нажатие левой и правой кнопок мыши, а именно: изменять диапазон движения курсора по горизонтали при нажатии левой клавиши мыши, а по вертикали при нажатии правой клавиши. Увы в ассемблере я не силен, поэтому прошу помощи здесь. Вот код, который я написал:
Код:
.model tiny
data_seg segment
data_seg ends
main segment

;устанавливаем соответствие между регистрами и сегмантами
assume cs:main, ds:data_seg

start:
;посылаем начальный адрес сегмента в регистр ax
	mov ax, data_seg
	mov ds, ax

;видеорежим (640x480)
	mov ax, 12h
	int 10h

;инициализация мыши
	mov ax, 0
	int 33h

;сделать указатель видимым
	mov ax, 1
	int 33h

;устанавливаем обработчик для нажатия ЛКМ
	mov ax, 0Ch
	mov bx, seg MOUSE
	mov es, bx
	lea dx, MOUSE
	mov cx, 0000000000000010B
	int 33h

;ждем нажатия кнопки
  jmp waiting


waiting:
  mov ah, 08H
  int 21h
  jz start
  cmp al, 27
  jne start
  
  mov ax, 2      
  int 33h
  mov ax, 4c00h

  int 21h



;процедура обработки нажатия ЛКМ
MOUSE PROC FAR
	mov ax, 07h
	mov cx, 10h
	mov dx, 80h
	int 33h
;устанавливаем обработчик для нажатия ПКМ
	mov ax, 0Ch
	mov bx, seg MOUSE1
	mov es, bx
	lea dx, MOUSE1
	mov cx, 0000000000001000B
	int 33h
ret
ENDP

;процедура обработки нажатия ПКМ
MOUSE1 PROC FAR
	mov ax, 08h
	mov cx, 50h
	mov dx, 8Dh
	int 33h
;устанавливаем обработчик для нажатия ЛКМ
	mov ax, 0Ch
	mov bx, seg MOUSE
	mov es, bx
	lea dx, MOUSE
	mov cx, 0000000000000010B
	int 33h
ret
ENDP

main ends
end start
программа работает, но как вы понимаете, правая кнопка мыши срабатывает только после того, как уже сработала левая. подскажите пожалуйста, как сделать, чтобы программа работала правильно и запускалась и с нажатия ЛКМ, и с нажатия ПКМ. я уверен, что это просто, но я совсем не знаю ассемблер...поэтому прошу помощи. заранее благодарен!
turbovitalik вне форума Ответить с цитированием
Старый 11.09.2011, 18:28   #2
VadikV
Форумчанин
 
Аватар для VadikV
 
Регистрация: 08.01.2011
Сообщений: 226
По умолчанию

Посмотри в сторону функции 3 (mov ax,3) прерывания 33h. В регистре bx будут флаги нажатых кнопок. Вот по этим флагам уже и выполняй нужные действия.
icq 223-630-454
e-mail vysotskiy@list.ru
сайт http://www.big-library.net/
VadikV вне форума Ответить с цитированием
Старый 11.09.2011, 19:18   #3
turbovitalik
Новичок
Джуниор
 
Регистрация: 11.09.2011
Сообщений: 2
По умолчанию

спасибо за ответ. о функции 3 почитал, но как конкретно применить ее в этом случае увы не разберусь. VadikV, если там нужно вставить небольшой кусочек кода, не могли бы вы написать какой именно? или же здесь нужно менять полностью подход, т.е. весь код?
turbovitalik вне форума Ответить с цитированием
Старый 12.09.2011, 08:49   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

turbovitalik
Код:
mov ax,0;Функция 00h предназначена для выяснения, загружен ли в память 
	int 33h;драйвер мыши. Если эта функция возвращает AX = 0, то драйвер 
	test ax,ax;отсутствует. Если драйвер загружен, то AX = 0FFFFh , а в 
	jz exit;регистре BX - число кнопок мыши
	mov ax,0Ch;Функция 0Ch позволяет программно задать реакцию на события 
	push cs;связанные с мышью: ее перемещения, нажатие и отпускание кнопок. 
	pop es;События, на которые необходимо реагировать, должны быть отмечены 
	mov cx,10100b;единицами в соответствующих разрядах регистра CX. CX=1 - 
;вызвать подпрограмму, если левая клавиша отпущена. После выполнения этой 
	mov dx,offset mouse;функции драйвер мыши на каждое из заданных событий 
        int 33h;будет реагировать вызовом обработчика событий - подпрограммы, 
;FAR-указатель на адрес которой был указан в регистрах ES:DX
;Номер 	Назначение маски вызова
;бита
;0	Вызвать, если мышь перемещается
;1	Вызвать, если левая клавиша нажата
;2	Вызвать, если левая клавиша отпущена
;3	Вызвать, если правая клавиша нажата
;4	Вызвать, если правая клавиша отпущена
;5	Вызвать, если средняя клавиша нажата
;6	Вызвать, если средняя клавиша отпущена
;--------------------------------------------------
	mov ax,1;Функция 01h включает изображение курсора мыши на экране.
        int 33h
;---------------------------------------------------------------------
	mov ah,0
	int 16h;жду пока не нажмут на клавиатуру
        mov ax,14h
        mov cx,0;удалить обработчик событий мыши
        int 33h
exit:	mov ah,4Ch;выхожу из программы
	int 21h
;-------------------------------------------------
proc mouse
	test bx,1
	jz left; нажали на левую клавишу
	. . .;здесь обработка нажатия на правую клавишу
        retf
left:	. . .;здесь обработка нажатия на левую клавишу
	retf
endp
Mikl___ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка события от нажатия клавиши мыши. es4e Помощь студентам 2 16.02.2011 21:24
Перехват нажатия кнопок мыши DarkEvil Win Api 7 15.06.2009 22:38
C#: передача нажатия кнопок в браузер Savrik Общие вопросы .NET 3 13.06.2009 00:07