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

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Alguien sabe como conseguir esto
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 3 [4] Ir Abajo Respuesta Imprimir
Autor Tema: Alguien sabe como conseguir esto  (Leído 12,162 veces)
Fran1946

Desconectado Desconectado

Mensajes: 56


Ver Perfil
Re: Alguien sabe como conseguir esto
« Respuesta #30 en: 13 Febrero 2020, 19:19 pm »

He tardado un poco en responder por que he  estado estudiando y probando el código que me habéis suministrado.

Ante todo muchísimas gracias, por vuestra ayuda.

NEBIRE:
El código nuevo (ampliado) tampoco funciona con los malditos nombres raros, pero el anterior si funciona para nombres chinos y alguno mas, así que utilizo este, y en los casos de archivos que no los pueda reconocer, pues simplemente no los añade a la lista, en mi caso solo tengo esos 3 archivos que son checos.

FJDA:
La opción que sugieres de renombrar archivos es inviable, tienen que conservar sus nombres originales, por que algunas imágenes jpg se utilizan en alguna aplicación y si cambian el nombre las consecuencias pueden ser desastrosas.

Ya tengo todo resuelto excepto este código que pongo aquí (Solo hay una línea de código que no consigo que funcione), y es la que tiene este comentario:

'Aquí necesito obtener Hwnd de los MenuID, para añadirlos a List1

El código:

Código:
Private Sub Command1_Click()
    Dim Handle As Long
    Dim hWnd As Long
    Dim hMainMenu As Long
    Dim hMenu As Long
    Dim MenuID As Long
    Dim szbuf As String * 128
    Dim szBufM As String * 128
    Dim I, Z, X
    List1.Clear
    List2.Clear
    List3.Clear
    List4.Clear
    Z = 2 'Posición del menú
    I = 0 'Posición del submenú
    For I = 0 To 30
        hWnd = FindWindow("SDPaintApp", vbNullString)   'handle Ventana aplicación
        If hWnd = 0 Then Exit Sub
        hMainMenu = GetMenu(hWnd)
        hMenu = GetSubMenu(hMainMenu, Z)
        MenuID = GetMenuItemID(hMenu, I)
        Call GetMenuString(hMenu, MenuID, szbuf, 128, MF_BYPOSITION & MF_POPUP)
        If MenuID > 0 Then
            List1.AddItem hMainMenu
            List2.AddItem hMenu
            List3.AddItem MenuID
            List4.AddItem szbuf 'Nombre del menú
            'X = SendMessage(hWnd, WM_COMMAND, MenuID, 0&)  esto ejecuta el MenuID
            'Aquí necesito obtener Hwnd de cada MenuID, para añadirlos a un ListBox
        End If
    Next
End Sub

Espero que esto sea muy fácil para vosotros.
Gracias.



En línea

FJDA


Desconectado Desconectado

Mensajes: 322


Ver Perfil
Re: Alguien sabe como conseguir esto
« Respuesta #31 en: 14 Febrero 2020, 17:19 pm »


            'Aquí necesito obtener Hwnd de cada MenuID, para añadirlos a un ListBox

No  te lo puedo asegurar pero los submenus si es a lo que te refieres no tiene handle. Para diregirte a ellos usa MenuID tal como has hecho.

Este código rastrea todos los menús y submenus, es similar al tuyo. Pero tal como muestro la información te quedará más claro.En un nuevo proyecto, crea 4 listbox tal como lo pusistes y un botón y pega este código.


Código
  1. Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
  2. (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  3. Private Declare Function GetMenu Lib "user32" (ByVal hWnd As Long) As Long
  4. Private Declare Function GetMenuItemID Lib "user32" _
  5. (ByVal hMenu As Long, ByVal nPos As Long) As Long
  6. Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
  7. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
  8. (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
  9. Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
  10. Private Declare Function GetMenuString Lib "user32" Alias "GetMenuStringA" _
  11. (ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString As String, _
  12. ByVal nMaxCount As Long, ByVal wFlag As Long) As Long
  13.  
  14. Const WM_COMMAND = &H111
  15. Const WM_SYSCOMMAND = &H112
  16. Const MF_BYPOSITION = &H400&
  17. Const MF_POPUP = &H10&
  18. Const SW_NORMAL = 1
  19. Const SW_HIDE = 0
  20.  
  21. Private Sub Command1_Click()
  22.    Dim n As Variant
  23.    Dim hMainMenu As Long
  24.    Dim hMenu As Long
  25.    Dim MenuID As Long
  26.    Dim MenuCount As Long
  27.    Dim stringmenu As String
  28.    Dim szbuff As String * 128
  29.    Dim cabBuff As String * 128
  30.    Dim HwndParent As Long
  31.    Dim nPos As Integer
  32.    Dim nID As Integer
  33.    HwndParent = FindWindow("Notepad", vbNullString)
  34.    If HwndParent = 0 Then Exit Sub
  35.    hMainMenu = GetMenu(HwndParent)    'Obtiene el handle del menú de Notepad
  36.    MenuCount = GetMenuItemCount(hMainMenu) 'Cuenta el número de menús (no submenus)
  37.    For nPos = 0 To MenuCount - 1 'Bucle como tantos menús tenga notepad (son 5: 0,1,2,3,4)
  38.  
  39.        '//Obtiene las cabeceras
  40.        Call GetMenuString(hMainMenu, nPos, cabBuff, 128, MF_BYPOSITION)
  41.        List1.AddItem nPos & ": " & cabBuff
  42.        For nID = -1 To 1000 'Como no se cuantos submenus tiene bucleo desde -1 al 1000 (se empieza desde -1)
  43.            hMenu = GetSubMenu(hMainMenu, nPos) 'Obtiene el handle del submenú del menú Z
  44.            MenuID = GetMenuItemID(hMenu, nID) 'Obtiene el ID del submenú
  45.            If MenuID > -1 And MenuID > 0 Then
  46.                Call GetMenuString(hMenu, MenuID, szbuff, 128, MF_BYPOSITION & MF_POPUP)
  47.                    List2.AddItem "cab:" & nPos & "-> " & hMenu   '//Handle
  48.                    List3.AddItem "cab:" & nPos & "-> " & MenuID   '//MenuID
  49.                    List4.AddItem "cab:" & nPos & "-> " & szbuff   '//Nombre
  50.                End If
  51.        Next nID
  52.    Next nPos
  53. '//DEMOSTRACIÓN'//
  54. '/////////////////////////////////
  55. '//Envía un mensaje a Notepad
  56. '//para que ejecute el menú Ayuda
  57. '/////////////////////////////////
  58. AppActivate "Sin título: Bloc de notas" '//Activa el notepad
  59. MenuID = 65& '//-<--Introduce el ID del menú en la variable
  60. SendMessage HwndParent, WM_COMMAND, MenuID, 0&    'esto ejecuta el ID 65 (Acerca de bloc de notas)
  61.  
  62. End Sub
  63.  
  64.  
  65. Private Sub Form_Load()
  66. 'Inicia notepad.exe
  67. Dim X As Long, hw As Long
  68. Dim WshShell As Object
  69. Set WshShell = CreateObject("Wscript.Shell")
  70. WshShell.Run "cmd.exe start  /r notepad.exe", SW_HIDE, 0
  71.  
  72. End Sub
  73.  


Puedes usar GetMenuItemInfo par obtener información de menús, por ejemplo si están checkeados e igualmente los nombres, por ejemplo. Pero hSubMenu siempre te devolverá 0 si no me equivoco.

Código
  1. Private Type MENUITEMINFO
  2.    cbSize As Long
  3.    fMask As Long
  4.    fType As Long
  5.    fState As Long
  6.    wID As Long
  7.    hSubMenu As Long
  8.    hbmpChecked As Long
  9.    hbmpUnchecked As Long
  10.    dwItemData As Long
  11.    dwTypeData As String
  12.    cch As Long
  13. End Type
  14.  
  15. Private Declare Function GetMenuItemInfo Lib "user32" Alias "GetMenuItemInfoA" _
  16. (ByVal hMenu As Long, ByVal un As Long, ByVal b As Long, lpMenuItemInfo As MENUITEMINFO) As Long
  17.  






« Última modificación: 14 Febrero 2020, 21:12 pm por FJDA » En línea

Fran1946

Desconectado Desconectado

Mensajes: 56


Ver Perfil
Re: Alguien sabe como conseguir esto
« Respuesta #32 en: 14 Febrero 2020, 19:53 pm »

Muy bueno este código, este es para mi colección seguro que lo utilizaré.

Te he mandado un mensaje.

Lo que necesito hacer es que queden inaccesibles todos los menúes, y lo he conseguido así:

Código:
Private Sub Command1_Click()
    'Dim Handle As Long
    Dim hWnd As Long
    Dim hMainMenu As Long
    Dim hMenu As Long
    Dim MenuID As Long
    Dim menuFlag As Long
    Dim szbuf As String * 128
    Dim szBufM As String * 128
    Dim i As Long, Z As Integer, x As Integer, j As Integer
1:
    List1.Clear
    List4.Clear
    Z = 0 'Posición del menú
    For i = 0 To 10
        hWnd = FindWindow("SDPaintApp", vbNullString)   'handle Ventana aplicación
        If hWnd = 0 Then Exit Sub
        hMainMenu = getmenu(hWnd)
        hMenu = GetSubMenu(hMainMenu, Z)
        MenuID = GetMenuItemID(hMenu, i)
        menuFlag = GetMenuState(hMenu, MenuID, MF_BYCOMMAND)
        Handle = Handle
        Call GetMenuString(hMenu, MenuID, szbuf, 128, MF_BYPOSITION & MF_POPUP)
        If MenuID > 0 Then
            List1.AddItem hMainMenu
            List4.AddItem szbuf 'Nombre del menú
            RemoveMenu hMainMenu, i, MF_BYPOSITION Or MF_DISABLED
            'X = SendMessage(hWnd, WM_COMMAND, MenuID, 0&)  esto ejecuta el MenuID
        End If
    Next
    x = List1.ListCount
    If x = 0 Then
        Call SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, 1 Or 2)   'encima
        Exit Sub
    Else
        GoTo 1
    End If
End Sub

Seguramente tu tienes una solución mejor, pero esta funciona perfecto.

Un saludo.
 
En línea

FJDA


Desconectado Desconectado

Mensajes: 322


Ver Perfil
Re: Alguien sabe como conseguir esto
« Respuesta #33 en: 14 Febrero 2020, 20:45 pm »

Muy bueno este código, este es para mi colección seguro que lo utilizaré.

Te he mandado un mensaje.

Lo que necesito hacer es que queden inaccesibles todos los menúes, y lo he conseguido así:

 ---
¿inaccesibles pero operativos o solo inaccesibles?

Puedes usar esta función la función API RemoveMenu:

Código:
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long


Código
  1. Public Function EliminarMenu(ByVal hwndAPP As Long)
  2.    Dim HWNDMenu As Long
  3.    Dim idpOS As Long
  4.    Dim i As Integer
  5.    Dim N As Long
  6. Dim d As Long
  7.    'hwnd del menu del programa
  8.    HWNDMenu = GetMenu(hwndAPP)
  9.    If HWNDMenu Then
  10.        n_Menu = GetMenuItemCount(HWNDMenu)
  11.        If n_Menu Then
  12.        For i = 1 To n_Menu     'Recorre todos los menú y los elimina
  13.        Call RemoveMenu(HWNDMenu, 0, MF_BYPOSITION)
  14.        Next
  15.        Call DrawMenuBar(hwndAPP)     'Repinta la barra de menú
  16.        End If
  17.    End If
  18. End Function


Código
  1. Call EliminarMenu(hwndAPP)
  2.  

EJEMPLO:
Código
  1. Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
  2. (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  3. Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
  4. Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
  5. Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
  6. Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
  7. Private Const MF_BYPOSITION = &H400&
  8.  
  9. Dim hwndAPP As Long
  10.  
  11. Private Sub Form_Load()
  12. Shell "notepad.exe", vbNormalFocus
  13. Do While hwndAPP = 0
  14. hwndAPP = FindWindow("Notepad", vbNullString)
  15. DoEvents
  16. Loop
  17. End Sub
  18. '//Oculgar menú
  19. Private Sub Command1_Click()
  20. Call EliminarMenu(hwndAPP)
  21. End Sub
  22.  
  23. Public Function EliminarMenu(ByVal hwndAPP As Long)
  24.    Dim HWNDMenu As Long
  25.    Dim idpOS As Long
  26.    Dim i As Integer
  27.    Dim N As Long
  28. Dim d As Long
  29.    'hwnd del menu del programa
  30.    HWNDMenu = GetMenu(hwndAPP)
  31.    If HWNDMenu Then
  32.        n_Menu = GetMenuItemCount(HWNDMenu)
  33.        If n_Menu Then
  34.        For i = 1 To n_Menu     'Recorre todos los menú y los elimina
  35.        Call RemoveMenu(HWNDMenu, 0, MF_BYPOSITION)
  36.        Next
  37.        Call DrawMenuBar(hwndAPP)  
  38.        End If
  39.    End If
  40. End Function
  41.  


« Última modificación: 14 Febrero 2020, 22:23 pm por FJDA » En línea

Fran1946

Desconectado Desconectado

Mensajes: 56


Ver Perfil
Re: Alguien sabe como conseguir esto
« Respuesta #34 en: 14 Febrero 2020, 22:33 pm »

Si tienen que ser no accesibles, pero operativos para el programa
En línea

Fran1946

Desconectado Desconectado

Mensajes: 56


Ver Perfil
Re: Alguien sabe como conseguir esto
« Respuesta #35 en: 14 Febrero 2020, 22:36 pm »

Yo no utilizo DrawMenuBar, quiero que desaparezcan
En línea

FJDA


Desconectado Desconectado

Mensajes: 322


Ver Perfil
Re: Alguien sabe como conseguir esto
« Respuesta #36 en: 14 Febrero 2020, 22:52 pm »

Si tienen que ser no accesibles, pero operativos para el programa

No te preocupes siguen estando operativos
edito:
Pero debes obtener el MenuID que quieres usar, meterlos en memoria en un array por ejemplo, porque una vez borrado no se puede obtener el ID.

Mira prueba:

Código
  1. Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
  2. (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  3. Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
  4. Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
  5. Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
  6. Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
  7. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
  8. (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
  9.  
  10. Private Const MF_BYPOSITION = &H400&
  11. Private Const WM_COMMAND = &H111
  12.  
  13. Dim hwndAPP As Long
  14.  
  15. Private Sub Form_Load()
  16. Shell "notepad.exe", vbNormalFocus
  17. Do While hwndAPP = 0
  18. hwndAPP = FindWindow("Notepad", vbNullString)
  19. DoEvents
  20. Loop
  21. Call EliminarMenu(hwndAPP)
  22. End Sub
  23.  
  24. Private Sub Command1_Click()
  25. Dim MenuID As Long
  26. MenuID = 65&
  27. AppActivate "Sin título: Bloc de notas"
  28. SendMessage hwndAPP, WM_COMMAND, MenuID, 0&
  29. End Sub
  30.  
  31. Public Function EliminarMenu(ByVal hwndAPP As Long)
  32.    Dim HWNDMenu As Long
  33.    Dim idpOS As Long
  34.    Dim i As Integer
  35.    Dim N As Long
  36. Dim d As Long
  37.    'hwnd del menu del programa
  38.    HWNDMenu = GetMenu(hwndAPP)
  39.    If HWNDMenu Then
  40.        n_Menu = GetMenuItemCount(HWNDMenu)
  41.        If n_Menu Then
  42.        For i = 1 To n_Menu     'Recorre todos los menú y los elimina
  43.        Call RemoveMenu(HWNDMenu, 0, MF_BYPOSITION)
  44.        Next
  45.        Call DrawMenuBar(hwndAPP)     'Repinta la barra de menú
  46.        End If
  47.    End If
  48. End Function
  49.  
  50.  
« Última modificación: 14 Febrero 2020, 23:18 pm por FJDA » En línea

Fran1946

Desconectado Desconectado

Mensajes: 56


Ver Perfil
Re: Alguien sabe como conseguir esto
« Respuesta #37 en: 15 Febrero 2020, 12:47 pm »

Perfecto...

Se queda así:

Código:
Public Function EliminarMenu(ByVal hwndAPP As Long)
    Dim HWNDMenu As Long
    Dim i As Integer, n_Menu As Long
   
    'hwnd del menu del programa
    HWNDMenu = GetMenu(hwndAPP)
    SendMessage hwndAPP, WM_COMMAND, 57642, 0&    'esto ejecuta Crt+E Seleccionar todo
    If HWNDMenu Then
        n_Menu = GetMenuItemCount(HWNDMenu)
        If n_Menu Then
            For i = 1 To n_Menu     'Recorre todos los menú y los elimina
                Call RemoveMenu(HWNDMenu, 0, MF_BYPOSITION)
            Next
            Call DrawMenuBar(hwndAPP)     'Repinta la barra de menú, actualiza la App
        End If
    End If
End Function

Se ejecuta Ctr+E para que el cursor del mouse no tenga el icono del lápiz, que podría pintar y arruinar el proceso.

Una vez mas, muchísimas gracias.
En línea

FJDA


Desconectado Desconectado

Mensajes: 322


Ver Perfil
Re: Alguien sabe como conseguir esto
« Respuesta #38 en: 15 Febrero 2020, 13:06 pm »

Perfecto...

Se queda así:

Código:
Public Function EliminarMenu(ByVal hwndAPP As Long)
    Dim HWNDMenu As Long
    Dim i As Integer, n_Menu As Long
    
    'hwnd del menu del programa
    HWNDMenu = GetMenu(hwndAPP)
    SendMessage hwndAPP, WM_COMMAND, 57642, 0&    'esto ejecuta Crt+E Seleccionar todo
    If HWNDMenu Then
        n_Menu = GetMenuItemCount(HWNDMenu)
        If n_Menu Then
            For i = 1 To n_Menu     'Recorre todos los menú y los elimina
                Call RemoveMenu(HWNDMenu, 0, MF_BYPOSITION)
            Next
            Call DrawMenuBar(hwndAPP)     'Repinta la barra de menú, actualiza la App
        End If
    End If
End Function

Se ejecuta Ctr+E para que el cursor del mouse no tenga el icono del lápiz, que podría pintar y arruinar el proceso.

Una vez mas, muchísimas gracias.

al final te sirvío  :)

VB todavía no está muerto, bien por el foro que permita esta sección. ;-)

Aunque la mayoría de preguntas sobre   sql y base de datos, pero casi todas alguien las responde, aunque muchas con poca gana. También mucha gente se equivoca y hace preguntas sobre VB.NET, ya hay otra sección para eso.  Ayudarte me ha servido para recordar como era esto de programar (pero venía rodado por ayudar a otro usuario antes que a tí que si no...)  :xD
« Última modificación: 15 Febrero 2020, 13:09 pm por FJDA » En línea

Páginas: 1 2 3 [4] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
¿Alguien sabe como descifrar esto?
Criptografía
Tzdah 6 5,906 Último mensaje 7 Febrero 2013, 05:26 am
por Tzdah
Alguien sabe como se llama esto¿?
PHP
Roboto 8 3,641 Último mensaje 25 Marzo 2013, 17:10 pm
por 1mpuls0
Alguien sabe como ocultar esto?
Dudas Generales
Leandro3562 2 2,695 Último mensaje 11 Diciembre 2015, 19:21 pm
por Leandro3562
Saben como puedo conseguir esto? « 1 2 »
Foro Libre
Panic0 11 5,035 Último mensaje 13 Febrero 2021, 11:59 am
por Machacador
Alguien sabe como hacer esto con for??
Programación C/C++
Julia13 3 3,094 Último mensaje 14 Mayo 2021, 20:51 pm
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines