Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 |

 

  Вопрос: Как перехватить события мыши? Добавлено: 15.06.07 20:01  

Автор вопроса:  Иван | Web-сайт: www.harami.ru
Дорогие друзья,
Можно ли как-нибудь добиться, чтобы стандартный контрол, не поддерживающий событий 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 ";DispatchMessageA" (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-сайт: www.harami.ru
 Профиль | | #4
Добавлено: 18.06.07 13:40
Ну вешай не на мышь, а на WM_LBUTTONDOWN :)))


Так ведь не умею, вот беда :((

Ответить

Номер ответа: 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-сайт: www.harami.ru
 Профиль | | #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.. хотя первый пост тож не далеко ушёл от шаманства, но это мы назовём "заказное шаманство", т.к. топстартер хотел вообще без хуков...

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам