Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Fran1946

#11
Fantástico, es perfecto.

Tu ayuda ha sido extraordinaria, todo funciona como un reloj.
;-) ;-) ;-)

Que opinas sobre los argumentos que le respondí a NEBIRE.

Crees que un PictureBox puede hacer lo que hago con el visor, me refiero a que no sea capaz de cargar y visualizar archivos de jpg, son los únicos que maneja mi programa, con nombres largo, con caracteres raros y/o símbolos que no acepta?.

Y tampoco entiendo que después de muchas horas buscando en Internet, no he conseguido la info que tu me has dado, buscando específicamente lo referente a Ventanas padre e hijos.

Me reitero, mil gracias.
Un saludo.
#12
Usa ShowWindow y el comando HIDE_WINDOW = 0. Si lo has usado no funciona es que no lo harás bien digo yo. miratelo

Esto está resuelto y funciona perfecto.

Gracias.
#13
Cita de: FJDA en  5 Febrero 2020, 17:48 PM
usa un do While

Código (vb) [Seleccionar]



Do While HWNDParent = 0
  HWNDParent = [Buscar handle visualizador de windows]
  DoEvents '//esto es para evitar que la apliación se quede pillada
Loop


'Do While hwnd = 0
'[Abrir imagen en el visualizador de windows correspondiente]
'DoEvents
'Loop





Hola de nuevo:

Si yo tengo algo parecido, esto:

Public Function EjecutaShell(file As String) As Boolean
    Shell ("explorer.exe " & file)
    HwndOrg = 0
    tm = 0
    Timer2.Interval = 1
    Timer2.Enabled = True
    Do While HwndOrg = 0
        HwndOrg = FindWindow("photo_lightweight_viewer", vbNullString) ' consigo el hwnd
        DoEvents
        If tm = 100 And HwndOrg = 0 Then    'si no obtiene HwndOrg, sale a los 100 ms
            GoTo sal
        End If
    Loop
sal:
    Timer2.Interval = 0
    Timer2.Enabled = False
End Function


Y una cosa que se me olvidó...

Tampoco he conseguido, que no salgan los menues del visor, al pulsar botón dcho del ratón


Se  puede hacer?.
#14
Cita de: FJDA en  5 Febrero 2020, 15:20 PM
En realidad te equivocas respecto al árbol. Por esta razón no encuentras Photos_commandbar. No has entendido el concepto de ventanas Parents y Childs.

Realmente el árbol sería así:

Photo_Lightweight_Viewer
  - Photos_CommandBar
          - Photos_ButtonEx (Arc&hivo)
          - Photos_ButtonEx (&Imprimir)
          - Photos_ButtonEx (Correo &electrónico)
          - Photos_ButtonEx (&Grabar)
           - Photos_ButtonEx  (&Abrir)
           - Photos_ButtonEx ("") objeto oculto
           - Photos_ButtonEx ("") objeto oculto
  - Photos_PhotoCanvas
  - ATL:568ED690
           - Photos_ButtonEx  ("") objeto oculto
           - Photos_ButtonEx  ("") objeto oculto
           - Photos_ButtonEx  ("") objeto oculto
  - Photos_NavigationPane
            - Photos_NavigationBar
                   - Photos_ButtonEx (control de navegación)
                   - Photos_ButtonEx (control de navegación)
                   - Photos_ButtonEx (control de navegación)
                   - Photos_ButtonEx (control de navegación)
                   - Photos_ButtonEx (control de navegación)
                   - Photos_ButtonEx (control de navegación)
                   - Photos_ButtonEx (control de navegación)
                   - Photos_ButtonEx (control de navegación)


Entonces,  Photo_Lightweight_Viewer tiene cuatro hijos que son Photos_CommandBarPhotos_PhotoCanvas, ATL:568ED690 (no se lo que es) y Photos_NavigationPane

Con mi código lo que hice fue encontrar primero Photo_Lightweight_Viewer  y luego el hijo Photos_NavigationPane mediante éste encuentro su hijo Photos_NavigationBar y despues los botones.

Para encontrar Photos_CommandBar  necesito el handle (hwnd) del padre que es Photo_Lightweight_Viewer.

Por lo tanto para encontrarlo primero encuentras el padre que es
hPhoto_Lightweight_Viewer = FindWindow("Photo_Lightweight_Viewer", TITULODELAVENTANA)

y después uno de sus hijos que en este caso te interesa Photos_CommandBar

hPhotos_commandbar = FindWindowEx(hPhoto_Lightweight_Viewer, ByVal 0&, "Photos_commandbar", vbNullString)

Demostración:

Código (vb) [Seleccionar]
Dim TITULODELAVENTANA As String
Dim hPhoto_Lightweight_Viewer As Long
Dim hPhotos_commandbar As Long
TITULODELAVENTANA = "demo.jpg - Visualizador de fotos de Windows"

hPhoto_Lightweight_Viewer = FindWindow("Photo_Lightweight_Viewer", TITULODELAVENTANA)
hPhotos_commandbar = FindWindowEx(hPhoto_Lightweight_Viewer, ByVal 0&, "Photos_commandbar", vbNullString)
MsgBox "barra = " & Hex(hPhotos_commandbar)


Por si te sirve te dejo este código para ajustar colores (brillo, contraste, escala de grises, etc)

https://mega.nz/#!fBlyUCpQ!Kemdm1iZ52dScMcYy6cfak2VzEV4jZ8pBlByvkrLK_0

demostración:


Hola de nuevo:
He llegado tarde..
Ya lo había resuelto, después de estudiar tu código, no funcionaba por que tenía la variable de clase nueva 'Photos_commandbar' escrita como 'hPhotos_commandbar' y el resultado era 0.

Y como todos estos hijos:
           - Photos_ButtonEx (Arc&hivo)
           - Photos_ButtonEx (&Imprimir)
           - Photos_ButtonEx (Correo &electrónico)
           - Photos_ButtonEx (&Grabar)
           - Photos_ButtonEx  (&Abrir)
           - Photos_ButtonEx ("") objeto oculto
           - Photos_ButtonEx ("") objeto oculto
Tienen que estar prohibidos utilizarlos, simplemente cierro la ventana padre:
- Photos_CommandBar

Y de nuevo muchas gracias por el SetColorAdjustment.zip, este yo lo tenía yo.

Hay un cierto problemilla:

Después de cargar la imagen en el visor, llamo al Call de leer los Hwnd's
Y después se cierran las ventanas que no quiero, pero no siempre devuelve el Hwnd de algunas ventanas retorna = 0, pero si intercalo un delay de algunos milisegundos (tengo que probar cantos para que no retrase mucho) entre lecturas si devuelve valores correctos.
Alguna sugerencia a este respecto?.

Gracias de nuevo.


#15

Te preguntaba en mi mensaje anterior, por la funcionalidad, simplemente para sugerirte opciones más amplias, sencillas (de usar) y válidas, si se tratara (por ejemplo) de algo como girar una imagen cambiar brillo, guardar una imagen, etc, pués ofrecerte ejemplos de código, si fueran demasiadas cosas o bien más complejas sugerirte alguna librería... pero si prefieres no dar explicaciones en tu "proceso bastante complicado, que es irrelevante", entonces sigue con el camino que llevas...
[/quote]

Hola NEBIRE:

Lamento si te ha molestado mi respuesta, no es mi intención, simplemente no doy detalles de el tipo de procesos que hago con las imágenes por que es irrelevante y no guarda relación con mi consulta y tampoco tiene nada que ver con cambios de color, brillo, girar o comprimir, amén de que sería muy largo de explicar y haría mas difícil que alguien se interesara por responder.
Pero si debo de explicar, debido a tu interés por ayudar, por que he decidido utilizar el visor de Windows.
Yo utilizaba para ver la comparación un PictureBox, que sería más logico utilizar, pero  este control tiene muchos problemas de errores al cargar ciertas imágenes con nombres muy raros, como estos ejemplos que son reales:

!B,wfDHgBGk~$(KGrHgoOKj!EjlLmZDmvBKs6y)CFe!~~_3.jpg
鋼拉絲Steel Brushed Stainless.jpg
MATI BELEN, COVA Y ROSANA, CON ADRIANA, Y JOSE ANTONIO.jpg

Ninguno de estos archivos los carga PictureBox sin dar error, y por supuesto no los visualiza. Y además no puedo evitar ni sortear el error, si se produce, sin que se cierre el programa.
También necesitaba, que al comparar las imágenes originales y procesadas, pudiera hacer zoom para apreciar mejor ciertas diferencias, también esto ya lo tenía resuelto con barras scroll, que no me gustan nada.
Y todo esto y alguna cosilla más, lo tengo resuelto utilizando el visor de Windows, por las siguientes razones:
Los archivos raros los carga sin problema y sin error
Tengo el zoom, mejor del mundo, con la rueda del ratón, nada que ver con 2 scrollV y H
Mover la imagen, con cursor de icono de mano incluido, por muy grande que esta sea de forma perfecta, poder redimensionar el visor o maximizarlo, minimizarlo.
Y todo esto manejando simplemente 10 Hwnd's del visor de Windows, 35 líneas de código.
#16
Cita de: FJDA en  5 Febrero 2020, 09:34 AM
yo entiendo que se refiere con procesarlas a editarlas, cambiar brillo, contraste y estas cosas, puede que incluso el formato o compresión. Después compara una imagen "procesada" con otra original que no ha recibido cambios. ¿para qué? pues él sabrá.

Una vez más has acertado, hago un proceso bastante complicado, que es irrelevante.
Y por cierto NEBIRE, yo no mato moscas a cañonazos, mi pregunta está muy clara, al menos para FJDA.
#17
Hola FJDA:
;-) ;-) ;-)
Tienes razón he tenido mucha suerte con tu respuesta.
Es excelente, exactamente lo que necesitaba saber.

Y también por SPY++ , nunca lo había utilizado.

Pero tengo una duda, que te explico.
Este es el árbol, he añadido las clases que tu no mencionas.

'Orden de padre a hijos
    '1.Photo_Lightweight_Viewer
    '-----Photos_commandbar
    '-----Photos_photocanvas  Este handle no lo necesito
    '-----Photos_NavigationPane
    '---------Photos_NavigationBar
    '--------------Photos_ButtonEx

Yo supongo que de la ventana padre '1.Photo_Lightweight_Viewer' ...
sale estas 3:
Photos_commandbar este handle no se como conseguirlo, con tu código
Photos_photocanvas  Este handle no lo necesito, es la imagen
Photos_NavigationPane, este y sus hijos está claro

Me podrías decir como conseguir Photos_commandbar, por que esta ventana alberga los menúes que no puede utilizar el usuario, y esta ventana el programa tiene que cerrarla.

Muchísimas gracias por tu ayuda.

#18

Hola a todos;
Estoy haciendo un programa que carga imágenes, las salva en una carpeta, y luego  las procesa.
Después visualiza, utilizando el Visualizador de fotos de Windows, las originales y las procesadas para poder compararlas, conmutando las 2 imágenes pulsando los botones 3 o 5, en la imagen del Visualizador de fotos de Windows, o pulsando las teclas Dcha o Izq del teclado.
Pero hay que cerrar las ventanas que enumero mas abajo, para que el usuario no pueda utilizar los menúes, ni los botones 1, 2, 4, 6, 7 y 8 de la imagen.

Se como obtener los Hwnd de las ventanas del Visualizador de fotos de Windows de estas clases, que se ven en la imagen:
   photos_navigationpane
        photos_navigationbar
   photos_commandbar
        photos_buttonex

Pero dentro de la ventana photos_buttonex (color naranja en la imagen)
Hay 8 button numerados del 1 al 8 en la imagen, que en realidad tambien son ventanas, por que tienen Hwnd cada uno.
Y necesito obtener el Hwnd de cada uno, y no veo la forma de hacerlo.
Por que con el código que utilizo para obtener los Hwnd de las clases(ventanas)
photos_navigationpane, photos_navigationbar, photos_commandbar, y photos_buttonex, no me sirve por que no detecta los 8 botones.

El código es este:

Public Sub EnumChildProc(ByVal hWnd As Long)
    Dim hChild As Long, ret As Long, Caption As String, i As Integer
    Form5.ListMemoRuta.Clear
    hChild = FindWindowEx(hWnd, 0, vbNullString, vbNullString)
1:
    Do While hChild <> 0
        DoEvents
        'Llenamos un Buffer
        ClassName = Space$(128)
        'Recupera el Classname y lo devuelve en el Buffer
        ret = GetClassName(hChild, ClassName, 128)
        'Extraemos el nombre de la clase
        ClassName = LCase(Left$(ClassName, ret))
        Caption = String(GetWindowTextLength(hChild), Chr$(0))
        If InStr(ClassName, "photos_navigationpane") Then
            If Todo Then Form5.ListMemoRuta.AddItem hChild
            navigationpane = hChild
        ElseIf InStr(ClassName, "photos_commandbar") Then
            Form5.ListMemoRuta.AddItem hChild
        ElseIf InStr(ClassName, "atl:") Then
            Form5.ListMemoRuta.AddItem hChild
        ElseIf InStr(ClassName, "photos_navigationbar") Then
            If Todo Then Form5.ListMemoRuta.AddItem hChild
            navigationbar = hChild
        ElseIf InStr(ClassName, "photo_lightweight_viewer") Then
            'Form5.ListMemoRuta.AddItem hChild
            viewer = hChild
        ElseIf ClassName = "photos_buttonex" Then
            buttonex = hChild
        End If
        hChild = GetNextWindow(hChild, 2)
    Loop
    'lista de clases que hay que cerrar
2:
    For i = 0 To Form5.ListMemoRuta.ListCount - 1
        hChild = Form5.ListMemoRuta.List(i)
        Call SendMessage(hChild, WM_SYSCOMMAND, SC_CLOSE, ByVal 0&)
        Form5.ListMemoRuta.RemoveItem (i)
        GoTo 2
    Next



Pero con un timer y este código:


'Obtiene la coordenada del Mouse
ret = GetCursorPos(Cor)
'Recuperamos el HWND de la ventana asociada a esa coordenada
Handle = WindowFromPoint(Cor.x, Cor.y)
'Para calcular el ancho actual de la ventana
Call GetClientRect(Handle, rct)
If ClassName = "photos_buttonex" Then
        If rct.Right = 51 And rct.Bottom = 25 Then
                 'son los botones de 3  y  5 de la imagen
                 'no hace nada, por que son los que utiliza el programa
        Else
                 'cierra estas ventanas(botones), para que no el usuario no pueda pulsarlos
                  Call SendMessage(Handle, WM_SYSCOMMAND, SC_CLOSE, ByVal 0&)
        End If
End If


Al pasar el cursor del ratón encima del área de los botones 1, 2, 4, 6, 7 y 8, se cierran, por que solo de esta forma consigo obtener los Hwnd de cada uno, en la variable Handle del código.
Alguien sabe como conseguir los Hwnd de los botones 1, 2, 4, 6, 7 y 8 con código, sin tener que pasar el cursor del ratón encima de cada uno.
Y en el caso de que no se pueda o nadie lo sepa:

Alguien puede sugerirme el código para que el programa ponga el cursor del ratón encima del centro de cada uno de estos botones del  Visualizador de fotos de Windows(tengo las coordenadas X,Y de cada uno), para poder obtener el Handle, y así poder cerrarlos con Call SendMessage(Handle,WM_SYSCOMMAND, SC_CLOSE, ByVal 0&)

Por que no he conseguido nada que funcione.

Espero que me podáis ayudar a conseguirlo.

Gracias y un saludo.
#19
Copiado todo este código

Espero a lo que subas.

Muchas gracias de nuevo.

Un saludo.
#20
Perfecto, me espero a que subas todo esto.

Muchas gracias.

Un saludo.