Alguien sabe como conseguir esto

Iniciado por Fran1946, 4 Febrero 2020, 13:39 PM

0 Miembros y 2 Visitantes están viendo este tema.

Fran1946


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.

Fran1946

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.



FJDA

#12
Cita de: Fran1946 en  5 Febrero 2020, 17:35 PM

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



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







Cita de: Fran1946 en  5 Febrero 2020, 17:35 PM
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

:huh: pues no se que habrás hecho  :xD

Usa ShowWindow y el comando HIDE_WINDOW = 0. Si lo has usado no funciona es que no lo harás bien digo yo. miratelo

Código (vb) [Seleccionar]



Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
(ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long

Private Declare Function GetNextWindow Lib "user32" Alias "GetWindow" _
(ByVal hwnd As Long, ByVal wFlag As Long) As Long

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Const HIDE_WINDOW = 0
Const SHOW_OPENWINDOW = 1
Const GW_HWNDNEXT = 2
Const GW_CHILD = 5

Dim TITULODELAVENTANA As String
Dim hPhoto_Lightweight_Viewer As Long
Dim hPhotos_NavigationPane As Long
Dim hPhotos_NavigationBar As Long
Dim hPhotos_ButtonEx_1 As Long
Dim hPhotos_ButtonEx_2 As Long
Dim hPhotos_ButtonEx_3 As Long
Dim hPhotos_ButtonEx_4 As Long
Dim hPhotos_ButtonEx_5 As Long
Private Sub Command1_Click()

TITULODELAVENTANA = "Desierto.jpg - Visualizador de fotos de Windows"
'Orden de padre a hijos
'1.Photo_Lightweight_Viewer
'-----Photos_NavigationPane
'------------Photos_NavigationBar
'----------------------Photos_ButtonEx

'//handle de la ventana
hPhoto_Lightweight_Viewer = FindWindow("Photo_Lightweight_Viewer", TITULODELAVENTANA)

'//handle del panel
'handle de Photo_Lightweight_Viewer
handlePhotos_NavigationPane = FindWindowEx(hPhoto_Lightweight_Viewer, ByVal 0&, "Photos_NavigationPane", vbNullString)

'//Handle del control de botones
'handle de hPhotos_NavigationBar
handlePhotos_NavigationBar = FindWindowEx(handlePhotos_NavigationPane, ByVal 0&, "Photos_NavigationBar", vbNullString)


'//BOTONES
'//Como Photos_ButtonEx no tiene hijos a partir de aquí se usa  GW_HWNDNEXT
'//para obtener el handle del siguiente botón (ventana)

'handle de Photos_ButtonEx (la lupa)
hPhotos_ButtonEx_1 = FindWindowEx(handlePhotos_NavigationBar, ByVal 0&, "Photos_ButtonEx", vbNullString)

'handle de Photos_ButtonEx (botón maximizar)
hPhotos_ButtonEx_2 = GetWindow(hPhotos_ButtonEx_1, GW_HWNDNEXT)

'handle de Photos_ButtonEx (botón "izquierda")
hPhotos_ButtonEx_3 = GetWindow(hPhotos_ButtonEx_2, GW_HWNDNEXT)

'handle de Photos_ButtonEx (botón diapositivas)
hPhotos_ButtonEx_4 = GetWindow(hPhotos_ButtonEx_3, GW_HWNDNEXT)

'handle de Photos_ButtonEx (botón "derecha")
hPhotos_ButtonEx_5 = GetWindow(hPhotos_ButtonEx_4, GW_HWNDNEXT)


'quitar hPhotos_ButtonEx_1
Call ShowWindow(hPhotos_ButtonEx_1, HIDE_WINDOW)

'quitar hPhotos_ButtonEx_2
Call ShowWindow(hPhotos_ButtonEx_2, HIDE_WINDOW)

 'quitar hPhotos_ButtonEx_5
Call ShowWindow(hPhotos_ButtonEx_5, HIDE_WINDOW)

End Sub

Private Sub Command2_Click()
'mostrar hPhotos_ButtonEx_1
Call ShowWindow(hPhotos_ButtonEx_1, SHOW_OPENWINDOW)

'mostrar hPhotos_ButtonEx_2
Call ShowWindow(hPhotos_ButtonEx_2, SHOW_OPENWINDOW)

 'mostrar hPhotos_ButtonEx_5
Call ShowWindow(hPhotos_ButtonEx_5, SHOW_OPENWINDOW)

End Sub




Fran1946

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

FJDA

#14
pues tengo una ligera idea de que quizás si se pueda. Espera a que pruebe.






Fran1946

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.

FJDA

a ver, esto lo que hace es inhabilitar la ventana Photos_PhotoCanvas que contiene la imagen. De este modo no se puede usar el ratón (solo en Photos_PhotoCanvas)

Código (vb) [Seleccionar]



Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function EnableWindow Lib "user32" _
(ByVal hwnd As Long, ByVal fEnable As Long) As Long


Private Sub Command1_Click()
Dim hPhotos_PhotoCanvas As Long
Dim hPhoto_Lightweight_Viewer As Long

TITULODELAVENTANA = "Desierto.jpg - Visualizador de fotos de Windows"

'//handle de la ventana
hPhoto_Lightweight_Viewer = FindWindow("Photo_Lightweight_Viewer", TITULODELAVENTANA)

'//handle del Photos_PhotoCanvas
hPhotos_PhotoCanvas = FindWindowEx(hPhoto_Lightweight_Viewer, ByVal 0&, "Photos_PhotoCanvas", vbNullString)

Call EnableWindow(hPhotos_PhotoCanvas, vbFalse)
End Sub


Fran1946

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.

FJDA

#18
Cita de: Fran1946 en  5 Febrero 2020, 19:43 PM
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.

Con los rifirafes que tengas con otro usuario  yo ahí no me meto, menos si es del staff de este foro que no se si será, que aquí son muy susceptibles. ::)

En cuanto a lo del picture el error se produce porque para cargar una imagen debes hacer uso de LoadPicture() para la propiedad Picture de la imagen. Al cargar un nombre extraño no entiende determinados carácteres y se reemplazan por interrogantes, por ejemplo [C:\directorio\鋼拉絲Steel Brushed Stainless.jpg] queda como  [C:\directorio\???Steel Brushed Stainless.jpg]. Dado que el archivo ???Steel Brushed Stainless.jpg no existe da error. Da igual el cuadro de diálogo que uses al final debes meterlo en la propiedad la cual va a recibir un directorio que no existe. Por no hablar que no cargar algunos tipos de imagen como imágenes PNG.

Abría que investigar un poco el tema, ahora mismo no se me ocurre nada al respeto para solucionarlo.


Aquí tienes la explicación, realmente no es un problema del Picture si no de VB6:

http://www.cyberactivex.com/UnicodeTutorialVb.htm


Cita de: http://www.cyberactivex.com/UnicodeTutorialVb.htm
Aunque Visual Basic 6.0 almacena cadenas internamente como Unicode (UTF-16), tiene varias limitaciones:

- Se envía con controles solo ANSI (Etiqueta, Cuadro de texto, etc.).
- La ventana de propiedades en IDE es solo ANSI. Las cadenas Unicode se muestran como '????'
- PropertyBag convierte automáticamente cadenas Unicode a ANSI.
- Las funciones del portapapeles son solo ANSI.
- Los menús son solo ANSI.

Serapis

#19
Cita de: Fran1946 en  5 Febrero 2020, 17:14 PM
...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.
Bueno, en efecto, VB6 no se las lleva bien cuando en un nombre se colocan caracteres ANSI y UNICODE...
Lo cual no quiere decir que no tenga solución.

Te pongo un código de ejemplo que soluciona el caso, mediante una simple API...
Y luego una imagen... nota que la imagen es una captura de tu mensaje, pero el nombre d ela imagen es el mismo que tu tienes ahí arriba y nota como la imagen se carga perfectamente con este modo...

Código (vb) [Seleccionar]


Private Const INVALID_HANDLE_VALUE      As Long = -1
Private Const MAX_PATH                  As Long = 260
Private Const SHORT_PATH                As Long = 14

Private Type FILETIME
  dwLowDateTime                        As Long
  dwHighDateTime                       As Long
End Type
Private Type WIN32_FIND_DATA
  dwFileAttributes                     As Long
  ftCreationTime                       As FILETIME
  ftLastAccessTime                     As FILETIME
  ftLastWriteTime                      As FILETIME
  nFileSizeHigh                        As Long
  nFileSizeLow                         As Long
  dwReserved0                          As Long
  dwReserved1                          As Long
  cFileName                            As String * MAX_PATH
  cAlternate                           As String * SHORT_PATH
End Type

Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long


' Código dle botón que carga la imagen:
Private Sub Command1_Click()
   Dim Ruta As String
   
   cdlg.ShowOpen   ' Cdlg, es un control CommonDialog...
   If (Len(cdlg.FileName) > 0) Then
       Ruta = ResuelveRuta(cdlg.FileName)
       if (len(ruta)>0) then
           Set Picture1.Picture = LoadPicture(Ruta)
       end if
   End If
End Sub

' Función que resuelve el problema de los nombres con caracteres Unicode dentro del nombre...
Private Function ResuelveRuta(ByVal Ruta As String) As String
   Dim j As Long, k As Long, WFD As WIN32_FIND_DATA
   
   j = FindFirstFile(Ruta, WFD)
   If (j <> INVALID_HANDLE_VALUE) Then
       k = InStrRev(Ruta, "\")
       
       If (Left$(WFD.cAlternate, 1) <> Chr(0)) Then
           ResuelveRuta = Left$(Ruta, k) & WFD.cAlternate
       Else
           ResuelveRuta = Left$(Ruta, k) & WFD.cFileName
       End If
   Else
       ResuelveRuta = ""
   End If
End Function

Private Sub Form_Load()
   cdlg.InitDir = App.Path
End Sub




Otros problemas que tengas con los picturebox, se pueden ir viendo, si describes el problema en cuestión.