клик на объекте = форма + контролы на ней.
Мне неважны координаты, мне неважно даже знать, какая кнопка нажата...
До этого я и сам догадаться могу, но это ведет к трудно отлавливаемым ошибкам в случае добавления нового контрола и забития добавления соответствующей проверки. Да и контролов на форме ... много ...Twister писал(а):1. Проверять нажатие на каждом контроле...
Слишком заморочено, хотелось бы попроще...Twister писал(а):2. Ставить хук на клики и проверять где находится курсор (или не где находится, а окно родитель того окна, по которому был произведен щелчек - GetParent вернет 0 если родитель десктоп)
А вдруг как раз и подойдет?Twister писал(а):3. SetCapture - но это врядли подойдет...)
'в форме
Private Sub Form_Load()
Dim c As Control
Dim h1 As Long
Dim h2 As Long
On Error Resume Next
For Each c In Me.Controls
h1 = c.hwnd
If Err.Number = 0 Then
h2 = SetWindowLong(h1, GWL_WNDPROC, AddressOf TargetProc)
PostMessage h1, WM_SETPREVPTR, h2, 0
Else
Err.Clear
End If
Next c
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim c As Control
Dim h1 As Long
On Error Resume Next
For Each c In Me.Controls
h1 = c.hwnd
If Err.Number = 0 Then
PostMessage h1, WM_RESTOREFUNC, 0, 0
Else
Err.Clear
End If
Next c
End Sub
'в модуле
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const GWL_WNDPROC = -4
Public Const WM_USER = &H400
Public Const WM_LBUTTONUP = &H202
Public Const WM_SETPREVPTR = WM_USER + 1
Public Const WM_RESTOREFUNC = WM_USER + 2
Public Function TargetProc(ByVal hwnd As Long, ByVal message As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Static PrevFuncPointer As Long
Select Case message
Case WM_SETPREVPTR
PrevFuncPointer = wParam
Case WM_RESTOREFUNC
SetWindowLong hwnd, GWL_WNDPROC, PrevFuncPointer
Case WM_LBUTTONUP
Debug.Print "mouseup" 'типа кликнули
Case Else
If PrevFuncPointer = 0 Then
TargetProc = 0
Exit Function
End If
End Select
TargetProc = CallWindowProc(PrevFuncPointer, hwnd, message, wParam, lParam)
End Function
Antonariy писал(а):Админам: Тег code что-то глючит немного. Почему весь код закомментен?
vvs_adm писал(а):А чем сабклассинг от хука отличается?Antonariy писал(а):4. Сабклассинг
Вот я в нескольких статьях читал, что "ставится хук", и они меня запутали, гадыдля неграмотных (это для меня ) : сабклассинг - это механизм замены стандартной оконной процедуры класса на любую другую, которая будет принимать все сообщения, направляемые окну. После приема сообщения новая процедура должна передать его старой(стандартной) процедуре. Если новая процедура не передает сообщение старой процедуре, это называется блокировкой сообщения. Процесс замены и восстановления стандартной процедуры я буду называть установкой/снятием хука (хотя технически это не хук, но для удобства назовем его так).
Сейчас этот форум просматривают: Google-бот и гости: 117