поймать клики за пределами окна

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

поймать клики за пределами окна

Сообщение Space » 18.10.2009 (Вс) 3:48

нужно ловить любой клик за пределами окна. Делаю сабклассинг+SetCapture. В результате приходит только одно WM_LBUTTONDOWN от первого клика. Что не так?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: поймать клики за пределами окна

Сообщение alibek » 18.10.2009 (Вс) 8:50

Capture нужно возобновлять.
Читай доки.
Lasciate ogni speranza, voi ch'entrate.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: поймать клики за пределами окна

Сообщение awl100Alex » 18.10.2009 (Вс) 12:47

Space писал(а):нужно ловить любой клик за пределами окна.

А ты делай WH_MOUSE_LL...

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: поймать клики за пределами окна

Сообщение Space » 18.10.2009 (Вс) 19:32

Capture нужно возобновлять
возобновляю сразу после приёма мессаги - не помогает.
А ты делай WH_MOUSE_LL...
не понял
Если моё окно захватило мышь и потом другое приложение вызвало SetCapture, моё окно перестаёт получать сообщения мыши вне окна?

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: поймать клики за пределами окна

Сообщение awl100Alex » 19.10.2009 (Пн) 0:44

Space писал(а):не понял

Если тебе нужно ловить любой клик за пределами окна, чем возиться с SetCapture, тебе проще будет поставить низкоуровневый глобальный хук на мышь, используя для этого WH_MOUSE_LL прямо в VB без каких либо дополнительных отдельных модулей, и через параметр wParam получать WM_LBUTTONDOWN, WM_RBUTTONDOWN, к примеру. :) Так ведь гораздо удобней. Разве нет?

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: поймать клики за пределами окна

Сообщение Space » 19.10.2009 (Пн) 3:02

что не так?
Код: Выделить всё
Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim Ret As Long, i As Long, iI As Integer
...
   Case WM_LBUTTONDOWN
Debug.Print "WM_LBUTTONDOWN"
    ReleaseCapture
    SetCapture frmMain.hwnd
...
'передать сообщение стандартному обработчику сообщений Windows
    WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)     
 
End Function

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: поймать клики за пределами окна

Сообщение awl100Alex » 19.10.2009 (Пн) 9:58

Вот упрямый! :?

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: поймать клики за пределами окна

Сообщение Space » 19.10.2009 (Пн) 19:03

с хуками сложновато

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: поймать клики за пределами окна

Сообщение awl100Alex » 19.10.2009 (Пн) 21:27

А что сложного???.. :shock:

Помести этот код в Форму...
Код: Выделить всё
Dim hhkLowLevelMosbd As Long

Private Sub Command1_Click() 'Установить хук
hhkLowLevelMosbd = SetWindowsHookEx(WH_MOUSE_LL, AddressOf LowLevelMouseProc, App.hInstance, 0)
End Sub

Private Sub Command2_Click() 'Снять хук
If hhkLowLevelMosbd <> 0 Then UnhookWindowsHookEx hhkLowLevelMosbd
End Sub

Private Sub Form_Unload(Cancel As Integer)
Command2_Click
End Sub


Этот в Модуль...
Код: Выделить всё
Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public Const WH_MOUSE_LL = 14
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_RBUTTONDOWN = &H204
Private Const HC_ACTION = 0

Public Function LowLevelMouseProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  If nCode = HC_ACTION Then
   Select Case wParam
    Case WM_LBUTTONDOWN
     Form1.Caption = "Нажата левая клавиша мышки"
    Case WM_RBUTTONDOWN
     Form1.Caption = "Нажата правая клавиша мышки"
   End Select
  End If
  LowLevelMouseProc = CallNextHookEx(0, nCode, wParam, ByVal lParam)
End Function

Вот и получишь контроль над кликами за пределами твоего окна. :)

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: поймать клики за пределами окна

Сообщение Space » 19.10.2009 (Пн) 21:50

спасибо. А какова вероятность того, что этот хук не установится? Т.е. какие ошибки могут быть? Надеюсь, антивиры не ругаются на него? А зачем ты проверяешь hhkLowLevelMosbd перед вызовом UnhookWindowsHookEx (чистое любопытство, ведь если хук не встанет, то и UnhookWindowsHookEx hhkLowLevelMosbd завершится неудачно, т.е. не сработает)?

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: поймать клики за пределами окна

Сообщение awl100Alex » 20.10.2009 (Вт) 10:07

Space писал(а):А какова вероятность того, что этот хук не установится?

Вероятность стремится к нулю. :) В моей практике такого не было ни разу! Если в системе уже установлен хук, то второй такой же просто ставится в очередь - цепочку обработки. Таким образом, можно ставить их хоть 10 подряд без проблем. :)
Хуки – это норма системы, антивирусы ругаться не будут, иначе бы им пришлось просто вырубить всю систему полностью. Исключением будут только известные проги-зловреды из его анивир. базы, что используют хук в несанкционированных целях. По поводу ошибок... смотри MSDN.

Space писал(а):А зачем ты проверяешь hhkLowLevelMosbd перед вызовом UnhookWindowsHookEx...

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

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: поймать клики за пределами окна

Сообщение Space » 28.10.2009 (Ср) 15:49

почему WM_RBUTTONDOWN чаще всего приходит дважды после одного клика?

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: поймать клики за пределами окна

Сообщение awl100Alex » 29.10.2009 (Чт) 10:54

Space писал(а):почему WM_RBUTTONDOWN чаще всего приходит дважды после одного клика?

К сожалению, это очень распространенное явление. Существует единственно верный способ устранения этого недостатка. Заключается он в следующем:
Первое, что нужно сделать – выключить компьютер. Затем, отключить мышку. Приготовить ватку и спирт. Внимание: спирт в данном случаи используется ТОЛЬКО(!) по назначению в технических целях! Как только все будет готово, необходимо аккуратно разобрать мышку и протереть спиртом контакты в нужных местах. Затем собрать, как было, и подключить обратно. Включаем компьютер – УРА! Все работает! WM_RBUTTONDOWN возвращает один клик!

P.S.
Если вышеописанный способ не сработает, то, к сожалению, мышку необходимо срочно изолировать в карантин и в последствии ликвидировать!
Завести новую мышку. Вот, в принципе, всё. :)

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: поймать клики за пределами окна

Сообщение Space » 29.10.2009 (Чт) 14:28

нет, спиртом не поможет. Надо взять напильник (рашпиль) и им аккуратно зачистить контакты. Ибо если это сделать не очень аккуратно, можно вообще не получить ни одного WM_RBUTTONDOWN. Сэкономленный спирт можно употребить вовнутрь для рестарта ОС в головном мозге :)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 87

    TopList