elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Agregar mensaje WM_MOUSEMOVE en header de listview
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Agregar mensaje WM_MOUSEMOVE en header de listview  (Leído 2,113 veces)
Juan Sanchez

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Agregar mensaje WM_MOUSEMOVE en header de listview
« en: 15 Agosto 2016, 18:09 »

Saludos a todos los integrantes del foro, bueno debo acudir a ustedes por un tema que tal ves no es tan necesario.

al parecer el ListView de VB.NET en la vista detalle no genera el mensaje WM_MOUSEMOVE cuando se pasa el mouse sobre las columnas de la cabecera o como se conoce header, y mi pregunta es como puedo agregar a la cola de mensajes de windows al header de listview en vb net para que cuando pase el mouse encima del header me mande ese mensaje.

Código
  1. Protected Overrides Sub WndProc(ByRef m As Message)
  2.  If m.Msg = WM_MOUSEMOVE Then
  3.    'Procesar mensaje cuando pase el mouse encima del header del ListView
  4.  End If
  5.  MyBase.WndProc(m)
  6. End Sub

Gracias de antemano por sus respuestas.


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: Agregar mensaje WM_MOUSEMOVE en header de listview
« Respuesta #1 en: 16 Agosto 2016, 08:36 »

Para empezar a indagar en el asunto, puedes enviar el mensaje LVM_GETHEADER al listview para obtener el handle de la ventana del header y seguidamente obtener rectangle de la ventana con la función GetWindowRectangle, y así al menos conocerás la posición y tamaño del header.

Por mi parte no logro hallar una posible solución, está dificil, me encontré con varias complicaciones y al final desistí, pero quizás con la información que te he proporcionado tu puedas llegar a alguna idea que a mi no se me ocurrió.

Te dejo aquí las definiciones necesarias:
Código
  1. <SuppressUnmanagedCodeSecurity>
  2. Friend NotInheritable Class NativeMethods
  3.  
  4.    Private Sub New()
  5.    End Sub
  6.  
  7.    <DllImport("user32.dll", SetLastError:=True)>
  8.    Friend Shared Function GetWindowRect(ByVal hwnd As IntPtr,
  9.                                   <Out> ByRef refRc As Rect
  10.    ) As <MarshalAs(UnmanagedType.Bool)> Boolean
  11.    End Function
  12.  
  13.    <DllImport("user32.dll", SetLastError:=True)>
  14.    Friend Shared Function SendMessage(ByVal hwnd As IntPtr,
  15.                                       ByVal msg As ListViewMessages,
  16.                                       ByVal wParam As IntPtr,
  17.                                       ByVal lParam As IntPtr
  18.    ) As IntPtr
  19.    End Function
  20.  
  21.    Friend Enum ListViewMessages As Integer
  22.  
  23.        <Browsable(False)>
  24.        <EditorBrowsable(EditorBrowsableState.Never)>
  25.        First = &H1000 ' LVM_FIRST defined in the Windows SDK file: CommCtrl.h
  26.  
  27.        GetHeader = (ListViewMessages.First + 31)
  28.  
  29.    End Enum
  30.  
  31.    <StructLayout(LayoutKind.Sequential)>
  32.    Friend Structure Rect
  33.  
  34.        Public Property Left As Integer
  35.        Public Property Top As Integer
  36.        Public Property Right As Integer
  37.        Public Property Bottom As Integer
  38.  
  39.        Public Sub New(ByVal left As Integer, ByVal top As Integer,
  40.                       ByVal right As Integer, ByVal bottom As Integer)
  41.  
  42.            Me.Left = left
  43.            Me.Top = top
  44.            Me.Right = right
  45.            Me.Bottom = bottom
  46.  
  47.        End Sub
  48.  
  49.        Public Shared Widening Operator CType(rect As Rect) As Rectangle
  50.            Return New Rectangle(rect.Left, rect.Top, (rect.Right - rect.Left), (rect.Bottom - rect.Top))
  51.        End Operator
  52.  
  53.    End Structure
  54.  
  55. End Class

Saludos!


« Última modificación: 16 Agosto 2016, 09:07 por Eleкtro » En línea


Juan Sanchez

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: Agregar mensaje WM_MOUSEMOVE en header de listview
« Respuesta #2 en: 20 Agosto 2016, 23:07 »

Bueno agradezco tu respuesta que siempre es bueno salir de dudas, lo que veo es que el procedimiento
Código
  1. Protected Overrides Sub WndProc(ByRef m As Message)
  2.  If m.Msg = WM_MOUSEMOVE Then
  3.    'Este procedimiento quiero que sea del header y no de ListView
  4.  End If
  5.  MyBase.WndProc(m)
  6. End Sub
es de la ventana ListView donde espera todos los mensajes a esa ventana y la ventana o el header es otra entonces se debe esperar casi de la misma forma los mensajes del header, en este caso el header solo envia el mensaje WM_NOTIFY a su ventana padre que es el ListView, no se si estoy equivocado quisiera que me despejen esa duda, y si fuese así como se haría para esperar los mensajes del header al igual que el listview con que apis o funciones se implementaría, leí en la web la API CallWindowProcA y CallWindowProcW pareciera que hacen eso, ahora mi idea se centra en implementar un procedimiento para el header y asi obtener el mensaje WM_MOUSEMOVE y otros como de su ventana padre listview.
Espero que me ayuden con eso, les agradezco por su ayuda, muchas gracias Elektro.
En línea

Juan Sanchez

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: Agregar mensaje WM_MOUSEMOVE en header de listview
« Respuesta #3 en: 21 Agosto 2016, 04:34 »

Tambien encontré en la web esta clase para capturar los mensajes de una ventana asignando un handle en el siguiente link https://msdn.microsoft.com/en-us/library/system.windows.forms.nativewindow.assignhandle(v=vs.110).aspx
Código
  1. Imports System.Runtime.InteropServices
  2. Friend Class HeaderControl
  3.  Inherits NativeWindow
  4.  
  5.  <DllImport("user32.dll", EntryPoint:="SendMessage")>
  6.  Private Shared Function SendMessage(hwnd As IntPtr, wMsg As Integer, wParam As IntPtr, lParam As IntPtr) As IntPtr
  7.  End Function
  8.  
  9.  Private Const LVM_GETHEADER As UInt32 = &H101F
  10.  Private Const WM_MOUSEMOVE As Int32 = &H200
  11.  
  12.  Public Sub New(LV As ListView)
  13.    'Get handle to LV header
  14.    Dim hWnd_LV_Header As IntPtr = SendMessage(LV.Handle, LVM_GETHEADER, IntPtr.Zero, IntPtr.Zero)
  15.    If hWnd_LV_Header <> IntPtr.Zero Then
  16.      Me.AssignHandle(hWnd_LV_Header)
  17.      AddHandler LV.HandleDestroyed, AddressOf LV_destroy ' To release handle when LV destroyed?
  18.    End If
  19.  End Sub
  20.  
  21.  Private Sub LV_destroy(sender As Object, e As EventArgs)
  22.    Me.ReleaseHandle()
  23.  End Sub
  24.  
  25.  ' subclass LV header...
  26.  Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
  27.    Select Case m.Msg
  28.      Case WM_MOUSEMOVE ' https://msdn.microsoft.com/en-us/library/windows/desktop/ms645616%28v=vs.85%29.aspx
  29.        ' show mouse location over LV column header
  30.        Debug.WriteLine("x={0}, y={1}", m.LParam.ToInt32 And &HFFFF&, m.LParam.ToInt32 \ &H10000 And &HFFFF&) ' http://support.microsoft.com/kb/112651
  31.    End Select
  32.    MyBase.WndProc(m)
  33.  End Sub
  34. End Class
Segun lo que entiendo esta clase escucha todos los mensajes del header de listview, y disculpen mi ignorancia estoy aprendiendo el lenguaje vb net, como integro la clase HeaderControl a mi clase Listview que es la siguiente.
Código
  1. Public Class ListView
  2.  Inherits Windows.Forms.ListView
  3.  
  4.  Public Sub New()
  5.    '
  6.  End Sub
  7.  
  8.  Protected Overrides Sub WndProc(ByRef m As Message)
  9.    'mensajes de listview
  10.    MyBase.WndProc(m)
  11.  End Sub
  12.  
  13. End Class

Gracias de antemano
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines