Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/26: Рейтинг темы: голосов - 26, средняя оценка - 4.96
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290

Подсчет нажатий кнопки мыши

24.09.2013, 16:05. Показов 5089. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите с программой.. Программа считает количество нажатий ЛКМ, нужно сделать, чтобы по нажатию сочетания клавиш Shift+M выводился MessageBox с количеством нажатий ЛКМ. Использую asmedit, TASM.
Assembler
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
.386
locals
jumps
.model flat,STDCALL
include win32.inc 
L equ <LARGE>
 
;=========Определение 32-х разрядных системных функций==========
Extrn   BeginPaint:PROC ;начало блока перерисовки окна
Extrn   CreateWindowExA:PROC    ;создать окно
Extrn   DefWindowProcA:PROC ;процедура обработки сообщений           ;по-умолчанию
Extrn   DispatchMessageA:PROC   ;процедура передачи сообщения             оконному обработчику сообщений
Extrn   EndPaint:PROC   ;завершение блока перерисовки ок-на
Extrn   ExitProcess:PROC    ;завершение программы
extrn   FindWindowA:PROC    ;поиск окна в ОС
extrn   GetMessageA:PROC    ;принять сообщение из системной          ;очереди
extrn   GetModuleHandleA:PROC   ;получить описатель модуля
extrn   GetStockObject:PROC ;получить описатель основного пера, кисти или шрифта
extrn   InvalidateRect:PROC ;объявление недостоверности областипользователя в окне
extrn   LoadCursorA:PROC    ;загузить иконку курсора
extrn   LoadIconA:PROC  ;загрузить пиктограмму
extrn   MessageBeep:PROC    ;издать звуковой сигнал
extrn   MessageBoxA:PROC    ;выдать системное окно с сообщением
extrn   PostQuitMessage:PROC    ;послать сообщение о выходе из программы
extrn   RegisterClassA:PROC ;регистрация класса окна
extrn   ShowWindow:PROC ;показать окно на экране
extrn   SetWindowPos:PROC   ;изменяет размер, положение и порядок окна
extrn   TextOutA:PROC   ;вывод текста в окно
extrn   TranslateMessage:PROC   ;обработка сообщений от клавиатуры
extrn   UpdateWindow:PROC   ;обновить окно
extrn   GetKeyboardState:PROC ;процедура вызова нажатия клавиш
 
;===============Ввод синонимов для имен функций===============
CreateWindowEx  equ <CreateWindowExA>
DefWindowProc   equ <DefWindowProcA>
DispatchMessage equ <DispatchMessageA>
FindWindow  equ <FindWindowA>
GetMessage  equ <GetMessageA>
GetModuleHandle equ <GetModuleHandleA>
LoadCursor  equ <LoadCursorA>
LoadIcon    equ <LoadIconA>
MessageBox  equ <MessageBoxA>
RegisterClass   equ <RegisterClassA>
TextOut equ <TextOutA>
 
;========Область данных========
.data
newhwnd dd 0        ;ячейку для хранения описателя (хэндела) нового окна.
lppaint PAINTSTRUCT <?> ;структура для перерисовки изобра-жения.
msg MSGSTRUCT   <?> ;структура системного сообщения.
wc  WNDCLASS    <?> ;структура для регистрации окна.
mbx_count   dd 0      ;ячейка - счетчик нажатий левой клавиши мыши.
hInst   dd 0       ;ячейка для хранения системного указателя (хэндела) нашей программы.
szTitleName db 'Win32 Assembly Program' ;текст заголовка окна программы.
zero    db 0    ;и его замыкающий ноль.
szAlternate db '(Secondary)',0  ;текст для изменения заголовка окна, если приложение запущено повторно.
szClassName  db 'ASMCLASS32',0 ;придуманное нами имя класса окна, под которым будем регистрироваться.
szPaint          db 'Левая кнопка нажата:' ;текст сообщения
s_num           db '00000000h --раз.',0  ;в окне программы.
MSG_L EQU ($-offset szPaint)-1
 
;========Область кода========    
.code
start:
        push    L 0 ;подготовим стэк к запуску процедуры
        call    GetModuleHandle ;выполним процедуру (результат в EAX)
        mov     [hInst], eax    ;поместим полученный хэндел на    ;подготовленное для него место
        push    L 0
        push    offset szClassName
        call    FindWindow
        or      eax,eax
        jz      reg_class
        mov     [zero], ' '
reg_class:
        mov     [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS
        mov     [wc.clsLpfnWndProc], offset WndProc
        mov     [wc.clsCbClsExtra], 0
        mov     [wc.clsCbWndExtra], 0
        mov     eax, [hInst]
        mov     [wc.clsHInstance], eax
        push    L IDI_APPLICATION
        push    L 0
        call    LoadIcon
        mov     [wc.clsHIcon], eax
        push    L IDC_ARROW
        push    L 0
        call    LoadCursor
        mov     [wc.clsHCursor], eax
        mov     [wc.clsHbrBackground], COLOR_WINDOW + 1
        mov     dword ptr [wc.clsLpszMenuName], 0
        mov     dword ptr [wc.clsLpszClassName], offset szClassName
        push    offset wc
        call    RegisterClass
        push    L 0                      ; параметры создания окна
        push    [hInst]                  ; описатель (хэндел) нашего приложения
        push    L 0                      ; описатель оконного меню
        push    L 0                      ; описатель родительского окна
        push    L CW_USEDEFAULT          ; высота окна
        push    L CW_USEDEFAULT          ; ширина окна
        push    L CW_USEDEFAULT          ; координата y окна
        push    L CW_USEDEFAULT          ; координата x окна
        push    L WS_OVERLAPPEDWINDOW    ; стиль окна
        push    offset szTitleName       ; строка заголовка окна
        push    offset szClassName       ; имя класса окна
        push    L 0                      ; расширенный стиль окна
        call    CreateWindowEx
        mov     [newhwnd], eax  
        push    L SW_SHOWNORMAL ;режим показа окна на экране - нормальный.
        push    [newhwnd]   ;описатель окна, подлежащего показу на экране
        call    ShowWindow
        push    [newhwnd]
        call    UpdateWindow
msg_loop:
        push    L 0
        push    L 0
        push    L 0
        push    offset msg
        call    GetMessage
        cmp     ax, 0
        je      end_loop
        push    offset msg
        call    TranslateMessage
        push    offset msg
        call    DispatchMessage
        jmp     msg_loop
end_loop:
        push    [msg.msWPARAM]
        call    ExitProcess
        
;========Оконная процедура========
WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD 
LOCAL   theDC:DWORD
cmp     [wmsg], WM_DESTROY  ;если - уничтожить окно?
        je      wmdestroy   ;то перейти на уничтожение
        cmp     [wmsg], WM_RBUTTONDOWN  ;нажата правая клавиша мыши?
        je      wmrbuttondown       ;то перейти на обработку этого нажатия
        cmp     [wmsg], WM_SIZE ;изменен размер окна?
        je      wmsize
        cmp     [wmsg], WM_CREATE   ;команда создать окно?
        je      wmcreate
        cmp     [wmsg], WM_LBUTTONDOWN  ;нажата левая клавиша мыши?
        je      wmlbuttondown
        cmp     [wmsg], WM_PAINT    ;это команда на перерисовку окна?
        je      wmpaint
        cmp     [wmsg], WM_KEYDOWN  ;нажата клавиша?
        je      wmkeydown
        cmp     [wmsg], WM_GETMINMAXINFO ;минимизировать/максимизировать окно?
        je      wmgetminmaxinfo 
        jmp     defwndproc  ;иначе перейти на обработчик сообщений по-умолчанию
 
wmkeydown:  ;начало блока вывода MessageBox
        cmp eax, VK_SHIFT & (VK_4D or VK_6D or VK_DC or VK_FC)
        je ames
        jne fmes
ames:   
        call MessageBox,0,offset [mbx_count],offset 'Подсчет',0
        cmp eax,IDYES
        je fmes
fmes:       
        jmp finish;конец блока вывода MessageBox
    
wmpaint:
push    offset lppaint
        push    [hwnd]
        call    BeginPaint
mov     [theDC], eax
        mov     eax, [mbx_count]
        mov     edi, offset s_num
        call    HexWrite32
        push    L MSG_L ;длина строки
        push    offset szPaint  ;адрес строки для вывода
        push    L 5 ;координата Y где выводится строка
        push    L 5 ;координата X где выводится строка
        push    [theDC] ;контекст устройства, через которое идет вывод
        call    TextOut
        push    offset lppaint
        push    [hwnd]
        call    EndPaint
 
wmcreate:
        mov     eax, 0
        jmp     finish
 
defwndproc:
        push    [lparam]
        push    [wparam]
        push    [wmsg]
        push    [hwnd]
        call    DefWindowProc
        jmp     finish
 
wmdestroy:
        push    L 0
        call    PostQuitMessage
        mov     eax, 0
        jmp     finish
 
wmlbuttondown:
        inc     [mbx_count]
        push    L 0
        push    L 0
        push    [hwnd]
        call    InvalidateRect    
        mov     eax, 0
        jmp     finish
 
wmrbuttondown:
        push    L 0
        call    MessageBeep
 
wmsize:
        mov     eax, 0
        jmp     finish
 
wmgetminmaxinfo:
        mov     ebx, [lparam]  ; указатель на структуру minmaxinfo 
        mov     [(MINMAXINFO ptr ebx).mintrackposition_x] , 350
        mov     [(MINMAXINFO ptr ebx).mintrackposition_y] , 60
        mov     eax, 0
       
finish:
        ret
WndProc          endp
HexWrite8 proc
        mov     ah, al  ;это число дублируется в ah
        and     al, 0fh ;затем в al оставляют младшую тетраду числа
        shr     ah, 4   ;а в ah - старшую
        or      ax, 3030h   ;кадый нибл дополняется единицами (преобразуется в
     ;символ)
        xchg    al, ah  ;байты меняются местами (так отображается на экране)
        cmp     ah, 39h ;идет сравнение старшего байта с символом '9'
        ja      @@4           ;переход, если символ оказался выше 9
@@1:
        cmp     al, 39h ;идет сравнение младшего байта с символом '9'
        ja      @@3     ;переход, если символ оказался выше 9
@@2:
        stosw           ;слово из AX заносится по адресу ES:EDI
        ret
@@3:
        sub     al, 30h ;у числа убираются биты, переводящие его в символ
        add     al, 'A' - 10    ;затем снова добавляются, переводя число в букву
        jmp     @@2
@@4:
        sub     ah, 30h ;у числа убираются биты, переводящие его в символ
        add     ah, 'A'-10  ;затем снова добавляются, переводя число в букву
        jmp     @@1
HexWrite8 endp
 
HexWrite16 proc
        push    ax
        xchg    al,ah
        call    HexWrite8
        pop     ax
        call    HexWrite8
        ret
HexWrite16 endp
 
HexWrite32 proc
push    eax
        shr     eax, 16
        call    HexWrite16
        pop     eax
        call    HexWrite16
        ret
HexWrite32 endp
 
public WndProc
ends
end start
Начал делать вызов сочетания в блоке вызова MessageBox - но ругается на ID клавиш.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.09.2013, 16:05
Ответы с готовыми решениями:

Как посчитать количество нажатий на кнопку мыши ?
Здравствуйте . Возникла проблема с подсчётом количества нажатий на кнопку мыши . Как это можно реализовать ? Для левой и правой нужно. ...

Подсчет нажатий кнопки
Пищю код который считает нажатия и записывает в лябел.Но 1 пощитало и дальше нет во код Dim a as long label1.text=a a=a+1 ...

Количество нажатий левой кнопки мыши на экран в текстовом режиме
Прошу помочь кто сможет! Написать программу, которая выводит количество нажатий левой кнопки мыши на экран в текстовом режими. Конец...

6
24.09.2013, 16:07

Не по теме:

так жутко на асме эта простая задача выглядит :)

0
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
24.09.2013, 16:18  [ТС]
Цитата Сообщение от Крюгер Посмотреть сообщение

Не по теме:

так жутко на асме эта простая задача выглядит :)

Задание такое) Доработать программу... Там WinAPI
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
24.09.2013, 16:57
Nkey,
половину из твоего кода можно выкинуть, посмотри Сам себе Iczelion а конкретно Win32 API. Урок 7a. Мышь там вывод на экран по нажатию на левую и правую клавиши мыши надписей, количество нажатий подсчитывается и их координаты запоминаются
0
programmer
 Аватар для Thread
2391 / 525 / 69
Регистрация: 01.06.2011
Сообщений: 3,639
25.09.2013, 08:43
SetWindowsHookEx
вешаешь событие,отдаешь процедуре в которой считаешь клики.
0
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
25.09.2013, 08:45  [ТС]
Цитата Сообщение от Thread Посмотреть сообщение
SetWindowsHookEx
вешаешь событие,отдаешь процедуре в которой считаешь клики.
Разве не GetKeyboardState? Для того чтобы принимать комбинацию клавиш?
0
programmer
 Аватар для Thread
2391 / 525 / 69
Регистрация: 01.06.2011
Сообщений: 3,639
25.09.2013, 12:03
Учить ставить хуки.Детский сад развели.
Для хуков я бы драйвер писал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.09.2013, 12:03
Помогаю со студенческими работами здесь

В выходной файл выведите количество двойных нажатий левой кнопки мыши
входные данные В первой строке входного файла указано количество действий 𝑛; она является натуральным числом и не превышает 1000....

Счетчик нажатий кнопки и удаление файла после 10-ти нажатий
Возникла такая проблема В программе необходимо скачать видео и после 10-ти просмотров удалить. Причем у программы-приложения должно быть...

Подсчёт количества «кликов» левой, правой и средней кнопки мыши
Написать приложение, в котором ведётся подсчёт количества «кликов» левой, правой и средней кнопки мыши. Обновляемую статистику необходимо...

Написать приложение, в котором ведётся подсчёт количества «кликов» левой и правой кнопки мыши
Пробовала по книжкам писать и сайтах, но никак не могу понять как правильно написать. Выбивает одну и ту же ошибку. Кто может помочь...

Подсчет количества "кликов" левой, правой и средней кнопки мыши
Написать приложение в котором ведется подсчет количества &quot;кликов&quot; левой, правой и средней кнопки мыши. Обновляемую статистику необходимо ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru