Страница: 1 | 2 | 3 |
Вопрос: Как перехватить события мыши?
Добавлено: 15.06.07 20:01
Автор вопроса: Иван | Web-сайт:
Дорогие друзья,
Можно ли как-нибудь добиться, чтобы стандартный контрол, не поддерживающий событий MouseDown и MouseUp, реагировал на эти события? Причем добиться, не создавая юзер-контрола и, желательно, не вешая хука на мышь.
(Конкретно: речь о стандартном комбо-боксе)
Заранее спасибо.
Ответы
Всего ответов: 32
Номер ответа: 1
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #1
Добавлено: 15.06.07 22:33
Ну Вы, батенька, и задачи ставите.
Вот, разве что по приколу:
Option Explicit
Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type COMBOBOXINFO
cbSize As Long
rcItem As RECT
rcButton As RECT
stateButton As Long
hwndCombo As Long
hwndItem As Long
hwndList As Long
End Type
Public Type POINTAPI
x As Long
y As Long
End Type
Private Type MSG
hwnd As Long
message As Long
wParam As Long
lParam As Long
time As Long
pt As POINTAPI
End Type
Private Declare Function GetMessage Lib "user32" Alias "GetMessageA" (lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As Long
Private Declare Function TranslateMessage Lib "user32" (lpMsg As MSG) As Long
Private Declare Function DispatchMessage Lib "user32" Alias "ispatchMessageA" (lpMsg As MSG) As Long
Private Declare Function GetComboBoxInfo Lib "user32" (ByVal hwnd As Long, infa As COMBOBOXINFO) As Long
Private Const WM_LBUTTONDOWN = &H201
Sub main()
Dim hwndEdit As Long
Dim msss As MSG
Dim cmbinf As COMBOBOXINFO
cmbinf.cbSize = LenB(cmbinf)
Call GetComboBoxInfo(Form1.Combo1.hwnd, cmbinf)
hwndEdit = cmbinf.hwndItem
Form1.Show
Do
Call GetMessage(msss, 0, 0, 0)
If ((msss.message = WM_LBUTTONDOWN) And (hwndEdit = msss.hwnd)) Then
MsgBox "WM_LBUTTONDOWN on Combobox Edit"
Exit Do
Else
Call TranslateMessage(msss)
Call DispatchMessage(msss)
End If
Loop
End Sub
Номер ответа: 2
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #2
Добавлено: 18.06.07 03:35
:\ Do..Loop смущает
Ну вешай не на мышь, а на WM_LBUTTONDOWN ))
Номер ответа: 3
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #3
Добавлено: 18.06.07 10:27
Do .. Loop - чтобы не возиться с сабклассингом.
Впрочем это, можно сказать, классический цикл любых приложений.
Номер ответа: 4
Автор ответа:
Иван
Вопросов: 34
Ответов: 53
Web-сайт:
Профиль | | #4
Добавлено: 18.06.07 13:40
Так ведь не умею, вот беда (
Номер ответа: 5
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #5
Добавлено: 18.06.07 14:14
Ну так учись Примеров достаточно много...
Номер ответа: 6
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #6
Добавлено: 18.06.07 14:15
Ну чего там сложного.
Тебе нужно:
1. определить текущую процедуру окна
GetWindowLong / GWL_WNDPROC
2. записать ее SetProp
3. переопределить процедуру
SetWindowLong / GWL_WNDPROC
4. Из новой процедуры вызвать старую
CallWindowProc / GetProp
Написать пример?
Номер ответа: 7
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #7
Добавлено: 18.06.07 22:46
Чёт не понял, а зачем с Property ?
Номер ответа: 8
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #8
Добавлено: 18.06.07 23:15
Ща обьясню.
Обычно запись предыдушей процедуры записывают
SetWindowLong в поле GWL_USERDATA, предполагая что поле пусто.
Но если речь идет о cmbinf.hwndItem, то можно увидеть, что она уже обладает какими-то своими данными, природу которых лень выискивать, при попытке записать адрес старой процедуры туда проект валится. Альтернативой модет служить SetProp / GetProp. При таком подходе ни быстродействие, ни сложность не меняются.
Номер ответа: 9
Автор ответа:
Иван
Вопросов: 34
Ответов: 53
Web-сайт:
Профиль | | #9
Добавлено: 19.06.07 02:35
Спасибо Вам большое, EUGY. Попробую.
Номер ответа: 10
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #10
Добавлено: 19.06.07 21:18
А зачем вся эта муть? Почему нельзя как обычно SetWindowsHook на комбобокс, назначив процедуру для обработки WM_LBUTTONDOWN, а в ней просто NextHook итд..?
Номер ответа: 11
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #11
Добавлено: 19.06.07 23:53
Эта муть = классика постороения оконных процедур,
с мининимум ошибок и времени на отладку.
Эта техтика имеет название, сабклассинг, и простая как пробка, (для тех кто пъет не пепси).
А вот причем здесь хуки, я даже затрудняюсь спорить.
Номер ответа: 12
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #12
Добавлено: 20.06.07 11:25
хм интересно, я всегда считал себя продвинутым, т.к. пъю кока-колу Насколько мне извесно, хуки - техника перехватов сообщений посылаемых к окну, согласно вопросу топстартера, он хочеть отловить WM_LBUTTONDOWN/WM_LBUTTONUP на комбобоксе. Спорить я также пока затрудняюсь, возможно невижу какой-то подводный камень, но сегодня дома обязательно попробую предложенный мною метод.
Номер ответа: 13
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #13
Добавлено: 20.06.07 17:33
хуки - не техника перехватов сообщений посылаемых к окну. Окна, в этом смысле, как собаке пятое колесо.
Хуки - регистратроры системных событий (мышы,клавы и пр). до того как они попадут в системную очерель.
То что нужно Ивану - самый банальный сабклассинг.
И это как два байта переслать.
Номер ответа: 14
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #14
Добавлено: 21.06.07 23:18
Не, я не спорю... я про то что это как-то далеко не
Классика - это примерно http://www.wasm.ru/forum/viewtopic.php?id=7248
Это как раз то о чём я говорил
SetWindowsHookEx+SetWindowLong+CallNextHookEx...
А Ваш пример в первом посте - это шаманство какоето, а не классика Я не говорю что он не работает, и даже не берусь судить лучше ли он чем действительно классика, одно могу сказать, это не
Номер ответа: 15
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #15
Добавлено: 21.06.07 23:23
Прошу прощения, имел ввиду всётаки 6-ой пост, после которого я спрашивал про SetProp/GetProp.. хотя первый пост тож не далеко ушёл от шаманства, но это мы назовём "заказное шаманство", т.к. топстартер хотел вообще без хуков...