Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 20.09.2010
Сообщений: 36

Работа с мышью

24.09.2011, 18:28. Показов 3316. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возникли трудности с рабором работы мыши.
Конкретно по делу:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include<conio.h>
#include<stdio.h>
int main()
{   int X,Y; 
int i=0;
unsigned char mask=1;
unsigned char SCAN;
int BUT;
int IS_ON;
clrscr();
asm {
     mov AX,3;
     int 0x33;
     mov X,CX;
     mov Y,DX;
     mov BUT,BX;
     mov AX,0;
     int 0x33;
     mov IS_ON,AX;
     }
printf ("%d,%d.\n",X,Y);
 
if (IS_ON==0x0FFFF)
printf ("Mouse Is On\n");
else
if (IS_ON==0x0000)
printf ("Mouse Is Off\n");
 
for(i=0;i<3;i++) {
if (mask & BUT)
{
  if (i==0)
  printf ("Left Mouse Button\n");
  if (i==1)
  printf ("Right Mouse Button\n");
  if (i==2)
  printf ("Middle Mouse Button\n");
}
mask=mask<<1;
}
 
asm { mov AH,0;
      int 0x16;
      mov SCAN,AH;
      }
if (SCAN==16)
asm { mov AX,2;
      int 0x33;
      }
getch();
return 0;
}
1)Вывод на экран координат X,Y
C
1
2
3
4
5
mov AX,3;
      int 0x33;
      mov X,CX;
      mov Y,DX;
      printf ("%d,%d.\n",X,Y);
Результат - координаты выводит.Но только почему-то они не всегда обновляются.Могу получить координаты,выйти из программы,переместить курсор мыши,снова запустить программу,но координаты останутся те же.А иногда меняются на другие.Не понятна причина.

2)Инициализация мыши IS_ON
C
1
2
3
4
5
6
7
8
mov AX,0;
      int 0x33;
      mov IS_ON,AX;
      if (IS_ON==0x0FFFF)
      printf ("Mouse Is On\n");
      else
      if (IS_ON==0x0000)
      printf ("Mouse Is Off\n");
Результат - работает корректно.Вроде бы.По крайней мере при подключенной к компьютеру мышке выдает Mouse Is On

3)Проверка на нажатие кнопки мыши BUT
C
1
2
3
4
5
6
7
8
9
10
11
12
13
mov BUT,BX;
      for(i=0;i<3;i++) {
      if (mask & BUT)
      {
      if (i==0)
      printf ("Left Mouse Button\n");
      if (i==1)
      printf ("Right Mouse Button\n");
      if (i==2)
      printf ("Middle Mouse Button\n");
      }
      mask=mask<<1;
      }
Результат - программа запущена,нажимаю кнопку мыши(правую/левую),сообщение не появлется.Подозреваю,что нужно,чтоб кнопка была нажата во время запуска программы,но с зажатой кнопкой мыши CTRL+F9 упорно не хочет запускать программу.Вопрос.Как сделать так,чтоб программа ожидала нажатия кнопки мыши,а затем выводила соответствующее сообщение о нажатой клавише?

4)Ну и последнее - при нажатии клавиши скрыть курсор мыши
C
1
2
3
4
5
6
7
8
asm { mov AH,0;
      int 0x16;
      mov SCAN,AH;
      }
      if (SCAN==16)
      asm { mov AX,2;
      int 0x33;
      }
Нажимаю q после запуска программы - ничего не происходит,а по-идее должен пропадать курсор.Что не так?
Кто может и захочет - хоть по какому-то вопросу дайте пояснения.Благодарю.

Добавлено через 3 часа 54 минуты
Все вопросы снимаются,кроме одного:
может ли быть такое,что под XP в DOS_BOX не убирается курсор,хотя всё прописано правильно?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.09.2011, 18:28
Ответы с готовыми решениями:

Работа с мышью. Обработка кликов
Обработка кликов мыши (0 - кликов нет, 1 - лкм, 2 - пкм). Знаю, что косяк в jmp progr - циклится же. Правда я ни как не могу осознать...

Работа с мышью через BIOS
Знаю, что работа с мышью осуществляется через Int 33h, а есть ли средства BIOS для работы с мышью, или через порты. ПОМОГИТЕ, ПОЖАЛУЙСТА.

Работа с мышью - исправить код
почему не работает сие творение .386 ;определяем с командами какого процессора работаем code segment 'code' ; определение кодового...

5
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
24.09.2011, 19:02
Вот честно не пробовал запускать программы для работы с мышью в досбоксе, но писал и запускал просто в ntvdm (стандартный эмулятор доса).
попробуйте запустить вашу программу(просто дважды щелкнуть) и развернуть ее на полный экран - alt + enter.
1
1 / 1 / 0
Регистрация: 20.09.2010
Сообщений: 36
24.09.2011, 23:19  [ТС]
Goodwin98, Спасибо,разобрался,запустил немного иначе и всё стало работать (правда,не так,как Вы описали,но попробую и так).

Добавлено через 3 часа 42 минуты
Остался один неразрешенный вопрос - Проверка на нажатие кнопки мыши.
Дошел до такого
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
while(!kbhit()) {
                   asm {
                        mov AX,3;
                        int 0x33;
                        mov BUT,BX;
                        }
                   for (i=0;i<3;i++)
                   {
                     if (mask&BUT)
                        {
                         if (i==0)
                         printf ("Left Mouse Button Is Pressed\n");
                         if (i==1)
                         printf ("Right Mouse Button Is Pressed\n");
                         if (i==2)
                         printf ("Middle Mouse Button Is Pressed\n");
                        }
                     mask=mask<<1;
                   }
                                    }
Но всё равно упорно не хочет работать это дело.Кто-то может подсказать как подправить код,чтоб всё-таки отображалось сообщение о нажатии кнопки мыши?
(По моей логике должно работать...Пока не нажмем клавишу,читаем состояние BX,переносим в BUT,дальше побитовое сравнение mask и BUT и в итоге сообщение на экран если совпадение)
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
25.09.2011, 14:19
Лучший ответ Сообщение было отмечено как решение

Решение

Demonhunterus,
INT 33 - MS MOUSE v1.0+ - DEFINE INTERRUPT SUBROUTINE PARAMETERS
AX = 000Ch
CX = call mask (see #03171)
ES: DX -> FAR routine (see #03172)
SeeAlso: AX=0018h

Bitfields for mouse call mask:
Bit(s) Description (Table 03171)
0 call if mouse moves
1 call if left button pressed
2 call if left button released
3 call if right button pressed
4 call if right button released
5 call if middle button pressed (Mouse Systems/Logitech/Genius mouse)
6 call if middle button released (Mouse Systems/Logitech/Genius mouse)
7-15 unused
Note: some versions of the Microsoft documentation incorrectly state that CX
bit 0 means call if mouse cursor moves

(Table 03172)
Values interrupt routine is called with:
AX = condition mask (same bit assignments as call mask)
BX = button state
CX = cursor column
DX = cursor row
SI = horizontal mickey count
DI = vertical mickey count
Notes: some versions of the Microsoft documentation erroneously swap the
meanings of SI and DI
in text modes, the row and column will be reported as a multiple of
the character cell size, typically 8x8 pixels
Перед выходом из проги вызвать с CX=0
Примерчик - в аттаче.
Вложения
Тип файла: zip mickey.zip (26.3 Кб, 201 просмотров)
3
1 / 1 / 0
Регистрация: 20.09.2010
Сообщений: 36
08.10.2011, 10:37  [ТС]
Charles Kludge, Ох,благодарю!
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
08.10.2011, 11:21
Demonhunterus, не за что.
ftp://ftp.simtel.net/.2/simtelnet/msdos/asmutl/ - ассорти исходников, описаний архивов нет
ftp://ftp.simtel.net/.2/simtelnet/msdos/asm_mag/ - The Assembly Language 'MAGAZINE', теория, англ.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.10.2011, 11:21
Помогаю со студенческими работами здесь

Работа с мышью
Вопрос наверно очень нубский но всьотаки .... как мне в C# как определить была нажата левая или правая кнопка мыши??? На пустой форме. ...

Работа с мышью
Здраствуйте форумчани. На форме есть много много RadioButton и нужно сделать перехватчик события который указывает, что элемент был выбран...

Работа с мышью
Можно ли курсором нажимать на фигуру (модуля граф), при этом что бы работала какая-нибудь процедура? Киньте пример программки.

Работа с мышью
MouseDown можно проверить ButtonState.Pressed, а вот MouseUp нельзя =(. Как отследить MouseUp?

Работа с мышью
Нужна ваша помощь. Незнаю как заставить двигатся курсор мыши только по окружности радиусом r с центром в точке (x,y), работа с мышью...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru