elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 08:33  


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo, raul338)
| | |-+  WM_NCHITTEST
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: WM_NCHITTEST  (Leído 228 veces)
Hasseds

Desconectado Desconectado

Mensajes: 144



Ver Perfil
WM_NCHITTEST
« en: 16 Agosto 2011, 23:10 »

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
 
 
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
 
 
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
 
 
 









« Última modificación: 17 Agosto 2011, 19:57 por Hasseds » En línea

Sergio Desanti
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines