WM_NCHITTEST

Iniciado por Hasseds, 16 Agosto 2011, 23:10 PM

0 Miembros y 1 Visitante están viendo este tema.

Hasseds

Hola, para el q le interese el Mensaje WM_NCHITTEST puede detectar en que lugar de una ventana o control está pasando el puntero del mouse o combinado con un hook al mouse tambien se puede saber donde se está haciendo un click (entre otras cosas)... Abarca el area-cliente, botones de cerrar, maximizar y minimizar, barra de titulo, icono de la barra, bordes derecho, izquierdo, angulos, bordes bixed, etc.

No se trata de un código optimizado, solo un simple concepto para el q no la conoce, saludos

Form

Código (vb) [Seleccionar]



Option Explicit

Private Sub Form_Load()
Call SetWindowPos(Me.hwnd, &HFFFF, &H0, &H0, &H0, &H0, &H2 Or &H1) 'on top (opcional)
Call StartHook
End Sub
Private Sub Form_Unload(Cancel As Integer)
 StopHook
End Sub






Module

Código (vb) [Seleccionar]



Option Explicit

'Modulo: NCHITTEST
'Autor   : Sergio Desanti (Hasseds)
'Test    : XP (32 BIT)


Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Private Declare Function SetWindowsHookEx Lib "user32.dll" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32.dll" (ByVal hHook As Long) As Long
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Type POINTAPI: x As Long: y As Long: End Type
Private Const WM_NCHITTEST = &H84

Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal Msg As Long, wParam As Any, lParam As Any) As Long
Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long

Dim hHook As Long

Function Make_lParam(ByVal x As Integer, ByVal y As Integer) As Long
 Make_lParam = x Or (y * &H10000)
End Function

Public Sub StartHook()
    hHook = SetWindowsHookEx(&HE, AddressOf MouseProc, App.hInstance, &H0)
End Sub

Public Sub StopHook()
   Call UnhookWindowsHookEx(hHook)
   hHook = 0
End Sub

Private Function MouseProc(ByVal ncode As Long, ByVal wParam As Long, lParam As POINTAPI) As Long

 Dim hwndl As Long
 hwndl = WindowFromPoint(lParam.x, lParam.y)
 
 Dim retNCHITTEST As Long
 retNCHITTEST = SendMessage(hwndl, WM_NCHITTEST, &H0&, ByVal Make_lParam(lParam.x, lParam.y))
 

 'If wParam = &H201 Then
   If hwndl = Form1.hwnd Then
     Select Case retNCHITTEST
       Case 1:  Form1.Caption = "AREA CLIENTE"
       Case 2:  Form1.Caption = "BARRA DE TITULO"
       Case 3:  Form1.Caption = "ICONO LA BARRA DE TITULO"
       Case 6:  Form1.Caption = "SCROLL HORIZONTAL"
       Case 7:  Form1.Caption = "SCROLL VERTICAL"
       Case 8:  Form1.Caption = "BOTON MINIMIZAR"
       Case 9:  Form1.Caption = "BOTON MAXIMIZAR"
       Case 10: Form1.Caption = "BORDE IZQUIERDO"
       Case 11: Form1.Caption = "BORDE DERECHO"
       Case 12: Form1.Caption = "BORDE SUPERIOR"
       Case 13: Form1.Caption = "BORDE SUPERIOR IZQUIERDO"
       Case 14: Form1.Caption = "BORDE SUPERIOR DERECHO"
       Case 15: Form1.Caption = "BORDE INFERIOR"
       Case 16: Form1.Caption = "BORDE INFERIOR IZQUIERDO"
       Case 17: Form1.Caption = "BORDE INFERIOR DERECHO"
       Case 18: Form1.Caption = "BORDE FIXED"
       Case 20: Form1.Caption = "BOTON CERRAR"
       Case 21: Form1.Caption = "BOTON AYUDA"
       Case Else: Form1.Caption = retNCHITTEST
     End Select
   Else
     Form1.Caption = "FUERA DE VENTANA"
   End If
 'End If
 
 '.......................................................................
  Dim PT As POINTAPI
  Call ClientToScreen(hwndl, PT)

  Form1.Cls
  Form1.Print "Coordenada Screen X " & lParam.x
  Form1.Print "Coordenada Screen Y " & lParam.y
 
  If hwndl = Form1.hwnd Then
    Form1.Print
    Form1.Print "Coordenada Control X " & lParam.x - PT.x
    Form1.Print "Coordenada Control Y " & lParam.y - PT.y
  End If
 '.......................................................................
 
 MouseProc = CallNextHookEx(hHook, ncode, wParam, lParam)

End Function










Sergio Desanti