|
|
| Посл.отвђт | Сообщен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 |