|
Mostrar Mensajes
|
Páginas: 1 [2] 3 4 5 6
|
11
|
Programación / Programación Visual Basic / Re: Alguien sabe como conseguir esto
|
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.
|
|
|
13
|
Programación / Programación Visual Basic / Re: Alguien sabe como conseguir esto
|
en: 5 Febrero 2020, 18:54 pm
|
usa un do While 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
|
Programación / Programación Visual Basic / Re: Alguien sabe como conseguir esto
|
en: 5 Febrero 2020, 17:35 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_CommandBar, Photos_PhotoCanvas, ATL:568ED690 (no se lo que es) y Photos_NavigationPaneCon 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_CommandBarhPhotos_commandbar = FindWindowEx(hPhoto_Lightweight_Viewer, ByVal 0&, "Photos_commandbar", vbNullString) Demostración: 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_0demostració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
|
Programación / Programación Visual Basic / Re: Alguien sabe como conseguir esto
|
en: 5 Febrero 2020, 17:14 pm
|
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
|
Programación / Programación Visual Basic / Re: Alguien sabe como conseguir esto
|
en: 5 Febrero 2020, 12:14 pm
|
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
|
Programación / Programación Visual Basic / Re: Alguien sabe como conseguir esto
|
en: 5 Febrero 2020, 12:07 pm
|
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
|
Programación / Programación Visual Basic / Alguien sabe como conseguir esto
|
en: 4 Febrero 2020, 13:39 pm
|
 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.
|
|
|
|
|
|
|