· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Хук на мышь

Посл.отвђт Сообщенiе


Дата: Апр 18, 2003 20:53:12

В своей проге решил использовать хук на мышь, т.к необходимо обработать клик правой кнопкой мыши на ListBox'е и появилась проблема: в WinXP все работает круто, а в Win95/98/ME программа зависает вместе со всей операционкой (в 98 даже мыша не шевелится).
Может кто знает альтернативный вариант получения сообщения о клике правой кнопкой на ListBox'е?
Если у кого-то есть желание покопаться в этой программке, то могу кинуть на мыло.
Вот, кстати, код хука:

MouseProc PROC nCode:DWORD, wParam:DWORD, lParam:DWORD
;--------------------------------------------------------------------------------
LOCAL hMenu_LSTB:HANDLE
LOCAL pnt:POINT
LOCAL szTB[256]:BYTE
LOCAL szTB1[256]:BYTE
;--------------------------------------------------------------------------------
invoke CallNextHookEx, hHook, nCode, wParam, lParam
mov edi, lParam
mov ecx, (MOUSEHOOKSTRUCT ptr [edi]).hwnd
.if hLSTB == ecx
.if wParam == WM_RBUTTONDOWN
; Посылаем обработчику сообщений окна сообщения WM_RBUTTONUP, WM_LBUTTONDOWN, WM_LBUTTONUP
m2m pnt.x, (MOUSEHOOKSTRUCT ptr [edi]).pt.x
m2m pnt.y, (MOUSEHOOKSTRUCT ptr [edi]).pt.y
mov ecx, hLSTB
invoke ScreenToClient, ecx, addr pnt
mov eax, pnt.y
shl eax, 16
mov ecx, pnt.x
or ecx, eax
push ecx
invoke SendDlgItemMessage, hMainWindow, ID_LSTB, WM_RBUTTONUP, NULL, ecx
pop ecx
push ecx
invoke SendDlgItemMessage, hMainWindow, ID_LSTB, WM_LBUTTONDOWN, NULL, ecx
pop ecx
push ecx
invoke SendDlgItemMessage, hMainWindow, ID_LSTB, WM_LBUTTONUP, NULL, ecx
; Проверяем на выбор пункта меню
pop ecx
invoke SendDlgItemMessage, hMainWindow, ID_LSTB, LB_ITEMFROMPOINT, NULL, ecx
shr eax, 16
.if eax == 1
jmp exit
.endif
; Отображаем списки
invoke LSTB_DBLClick
; Грузим меню
invoke LoadMenu, hInstance, ID_MENU_LSTB
invoke GetSubMenu, eax, 0
mov hMenu_LSTB, eax
invoke GetPrivateProfileString, offset szINI_Section_Main, offset szINI_Key_Owner, NULL, addr szTB, sizeof szTB, offset szIniFullName
invoke SendDlgItemMessage, hMainWindow, ID_LSTB, LB_GETCURSEL, NULL, NULL
mov ecx, eax
invoke SendDlgItemMessage, hMainWindow, ID_LSTB, LB_GETTEXT, ecx, addr szTB1
invoke lstrcmpi, addr szTB, addr szTB1
.if eax == 0
invoke DeleteMenu, hMenu_LSTB, 0, MF_BYPOSITION
invoke DeleteMenu, hMenu_LSTB, 0, MF_BYPOSITION
.endif
; Получение координат курсора и вывод меню
invoke GetCursorPos, addr pnt
invoke TrackPopupMenu, hMenu_LSTB, TPM_LEFTALIGN or TPM_TOPALIGN or TPM_NONOTIFY or TPM_LEFTBUTTON, pnt.x, pnt.y, NULL, hMainWindow, NULL
.endif
.endif

exit:
xor eax, eax
ret

MouseProc endp


Дата: Апр 21, 2003 09:40:34

Как я понял, ListBox находится непосредственно в твоей программе. Если это так, то по-моему проще было бы использовать стандартное виндовое сообщение WM_RBUTTONUP(кажется так).


Дата: Апр 21, 2003 12:07:57

сабклассинг имхо поможет отцу русской демократии..


Дата: Апр 27, 2003 00:14:51

Все круто заработало, необходимо было только заголовок процедуры записать следующим образом:
MouseProc PROC uses edi, nCode:DWORD, wParam:DWORD, lParam:DWORD
для восстановления значений регистра на выходе из процедуры.
Кстати также можно было заменить edi на edx и восстанавливать регистр уже бы не приходилось (небыло бы надобности).


Дата: Апр 28, 2003 00:06:54

Скажите smb. как поймать прерывание на порт мыши? Обращение к адресу 3FF чтоли, точно не помню, а лезть лень SI его у меня не хотел ловить.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.087