• Domingo 22 de Diciembre de 2024, 14:36

Autor Tema:  Sobre Menú  (Leído 1187 veces)

kofkurne

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Sobre Menú
« en: Martes 7 de Febrero de 2006, 19:47 »
0
Hola!!
Tengo un formulario con sólo un Textbox y un módulo.
Lo que quiero hacer es que cuando en el textbox pulse con el botón derecho y seleccione la opción -lectura de derecha a izquierda- ese menú emergente se cierre y que esa opción -lectura de derecha a izquierda- no sea ejecutada.

Yo a lo máximo que he llegado ha sido a interceptar cuando paso el cursor, por encima de la opción: -lectura de derecha a izquierda-. Pero me es imposible cerrar el menú y aparte interceptar cuando se pulse la opción y no como he hecho yo cuando paso el cursor..

Tal vez sea algo complicado, pero a ver si alguien me echa una mano..
Dejo el código para que probéis lo que digo:

En el formulario hay un Textbox. Este es el simple código que hay que poner en el formulario:
Código: Text
  1. Private Sub Form_Load()
  2.     Activa
  3. End Sub
  4.  
  5. Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  6.     Desactiva
  7. End Sub
  8.  

Y este código en el módulo:

Código: Text
  1. Option Explicit
  2.  
  3. Public Declare Function SetWindowLong Lib "user32" Alias _
  4. "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, _
  5. ByVal dwNewLong As Long) As Long
  6.  
  7. Public Declare Function CallWindowProc Lib "user32" _
  8. Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
  9. ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, _
  10. ByVal lParam As Long) As Long
  11.  
  12.  
  13. Public Const GWL_WNDPROC = (-4)
  14. Global PrevWndProc As Long
  15.  
  16. Public Sub Activa()
  17.     PrevWndProc = SetWindowLong(Form1.Text1.hWnd, GWL_WNDPROC, AddressOf interceptar)
  18. End Sub
  19.  
  20. Public Sub Desactiva()
  21.   Dim temp As Long
  22.     temp = SetWindowLong(Form1.Text1.hWnd, GWL_WNDPROC, PrevWndProc)
  23. End Sub
  24.  
  25. Public Function interceptar(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  26.     If Msg = &H11F Then 'WM_MENUSELECT = &H11F
  27.         If wParam = -2139062272 Then 'Es el parámetro wParam correspondiente.
  28.             Debug.Print "Has pasado sobre -lectura de derecha a izquierda- " & Now & ""
  29.             interceptar = True
  30.         End If
  31.     Else
  32.         interceptar = CallWindowProc(PrevWndProc, hWnd, Msg, wParam, lParam)
  33.     End If
  34. End Function
  35.  

Gracias

kofkurne

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Sobre Menú
« Respuesta #1 en: Domingo 12 de Febrero de 2006, 19:36 »
0
Después de mirar por todos los sitios que he podido, nadie consiguió echarme un cable, empecé a analizar códigos y al final no pude conseguir exactamente lo que pretendía.
Volví a pensar y dejar las API de lado y por si a alguien le resulta de ayuda, conseguí por fin resolver el problema del post. Decidí crear un menú no visible equivalente a copiar, pegar, eliminar, cortar y seleccionar todo y utilizar el portapapeles para manejar estos datos.
Y por último para cargar el menú sin que se vea el menú del sistema en el textbox lo que he hecho ha sido desactivarlo (enabled = false) y activarlo y así lo que estaba seleccionado queda todavía intacto..

Si alguien con el tiempo consigue hacerlo con las API seguiré este post...
Un saludo