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 - TomaSs

#1
Hola chic@s!

Pues quería realizarles la siguiente pregunta.
¿Sabrían decirme si la restauración de Windows 10 al estado de fábrica es totalmente seguro frente a virus? es decir, ¿Sería lo mismo usar esta opción que hacer una instalación limpia desde 0?

Gracias de antemano! ;)
#2
Vale, perfecto, pues ya me respondo yo mismo, porque después de mucho mirar, he probado a desactivar el antivirus y con el método más básico (Load) ha funcionado sin problemas. Después de mucho probar diferentes métodos, al final ha resultado ser eso, y lo curioso es que ya tenía el programita incluido en excepciones del firewall, pero por lo que se ve es del propio antivirus que tiene bloqueada esa web...

Ya se puede cerrar el tema.
#3
Hola chicos,

Pues este el mi problema, resulta que estoy tratando de cargar una imagen en un picturebox, cargándola directamente de una URL(esta concretamente), pero al tratar de hacerlo me devuelve el siguiente error:
Error en el servidor remoto: (403) Prohibido.

Lo que se me hace raro es que desde el navegador no hay ningún problema en cargarla y yo he tratado de hacerlo de diferentes maneras, directamente con el load del picturebox, y simulando una descarga incluyendo las cabeceras de la petición que se mandan al acceder desde navegador, y nada...
Aquí dejo los códigos de las dos formas que he intentado para ver si podéis ver algo, o si se os ocurre por que puede devolver ese error.

Código (csharp) [Seleccionar]
pictureBox1.Load("http://www.bajui.com/thumb_fichas/273116_m.jpg");

Código (csharp) [Seleccionar]
pictureBox1.LoadAsync("http://www.bajui.com/thumb_fichas/273116_m.jpg");

Código (csharp) [Seleccionar]

pictureBox1.Image = LoadImage("http://www.bajui.com/thumb_fichas/273116_m.jpg");

        public System.Drawing.Image LoadImage(System.String ImageUrl)
       {
           System.Uri Uri = null;
           if (System.Uri.TryCreate(ImageUrl, System.UriKind.Absolute, out Uri))
           {
               System.Net.WebClient WebClient = new System.Net.WebClient();
               WebClient.Headers.Add(System.Net.HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");
               WebClient.Headers.Add(System.Net.HttpRequestHeader.Accept, "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
               WebClient.Headers.Add(System.Net.HttpRequestHeader.Host, "www.bajui.com");
               WebClient.Headers.Add(System.Net.HttpRequestHeader.Pragma, "no-cache");
               WebClient.Headers.Add(System.Net.HttpRequestHeader.CacheControl, "no-cache");
               WebClient.Headers.Add(System.Net.HttpRequestHeader.Upgrade, "1");
               WebClient.Headers.Add(System.Net.HttpRequestHeader.AcceptEncoding, "gzip, deflate, sdch");
               WebClient.Headers.Add(System.Net.HttpRequestHeader.AcceptLanguage, "es,en-GB;q=0.8,en;q=0.6");
               WebClient.Headers.Add(System.Net.HttpRequestHeader.Cookie, "__utma=38917168.747487441.1455653731.1470859119.1474041540.19; __utmz=38917168.1455653731.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); _ga=GA1.2.747487441.1455653731; __cfduid=de082793b488840ffce7177ab686dd74e1481060560; layer=1");
               WebClient.Headers.Add("DNT", "1");
               WebClient.Headers.Add("Upgrade-Insecure-Requests", "1");

               System.Byte[] ImageBytes = WebClient.DownloadData(ImageUrl);
               WebClient.Dispose();

               System.IO.MemoryStream ImageMemoryStream = new System.IO.MemoryStream(ImageBytes);
               System.Drawing.Image Image = System.Drawing.Image.FromStream(ImageMemoryStream);
               ImageMemoryStream.Close();
               ImageMemoryStream.Dispose();
               return Image;
           }
           else
           {
               return null;
           }
       }


Muchas gracias de antemano! ;)
#4
Es que el tema es probable que tenga que ver con que el texto del label que estoy intentando sacar pertenece a un proceso diferente al de la ventana en la que esta incrustado y aparece, pero realmente inspector los muestra como descendientes de la ventana que menciono.

Me explico mejor:
- Proceso A: ventana normal win32
- Proceso B: al que pertenecen las etiquetas que se muestran sobre la ventana de proceso A.

Ese es el contexto, y tambien tengo que decir que de primeras me sorprendio que inspector mostrara las etiauetas que menciono dentro de la ventana, cuando realmente pertenecen a procesos diferentes.
De hecho, algo curioso que tambien ocurre es que cuando muevo la ventana, las etiquetas se ve como se mueven mas tarde, por lo que esta claro que no pertenecen a la misma.
Por eso tal vez tenga que buscar por las ramas del proceso B, en vez de las de la ventana del proceso A, a pesar de lo que muestre Inspector.

Hare alguna prueba mas tras el finde y ya comentare como va...

Muchas graciass!!!
#5
Cita de: Eleкtro en 12 Mayo 2016, 12:36 PM
Hola.

1:
La herramienta Spy++, aparte de poder considerarla obsoleta por su descontinuación de desarrollo o desactualización, está diseñada y enfocada para la inspección de ventanas Win32, y aquí surge el problema, por que una aplicación WPF no trabaja con el modelo de la API Win32/Win64, es una tecnología completamente diferente, sin embargo, el elemento de ventana principal de una aplicación WPF sigue exponiendo un handle de ventana (HWND) accesible mediante la class HwndWrapper, que sirve como contenedor de la WinAPI y WPF.

Como herramientas más modernas, completas y en constante actualización para inspeccionar ventanas Win32 y WPF, estas son mis recomendaciones:

  • XAML Spy
    Solamente para aplicaciones WPF.
    Tiene una interfáz de usuario muy amigable y bonita.
  • Microsoft UI Inspect
    Para aplicaciones Win32 y WPF.
    Lo puedes encontrar en el SDK de Windows para tu versión de Windows actual.




2:
Para identificar un elemento de una UI en WPF, generálmente no es necesario recurrir a la metodología que estás aplicando con la WinAPI, puedes evitar toda la tediosidad que supone la implementación y el uso inseguro de código no administrado con las típicas definiciones de las funciones que has mencionado de la lib. user32.dll para identificar elementos en la UI y etc...

En su lugar, puedes usar código administrado aprovechando el potencial del framework de Microsoft UI Automation, con los ensamblados de WPF (puedes utilizarlos desde windowsForms también, e incluso puedes utilizarlos para ventanas Win32 también, aunque todo esto dependerá siempre de ciertas circunstancias).

El uso de UI Automation resulta bastante sencillo, se basa en crear condiciones de búsqueda para hallar el elemento deseado, deberiamos saber lo que andamos buscando tras haber inspeccionado la aplicación con UI Inspect o nuestra herramienta favorita, pero si desconocemos lo que tenemos que buscar entonces siempre podemos iterar las ventanas y los árboles de controles para ir descubriendo la información como hariamos con el callback de la función EnumChildwindows y etc. para ventanas Win32.

Si creamos un nuevo proyecto WPF y le añadimos un LabelControl a la ventana principal, quedando así el código XAML:
Código (xml) [Seleccionar]
<Window x:Class="WpfApplication1.MainWindow"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
       xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
       xmlns:local="clr-namespace:WpfApplication1"
       mc:Ignorable="d"
       Title="Mi Ventana" Height="350" Width="525">
   <Grid>
       <Label Content="This is a Label control." />
   </Grid>
</Window>


Esto sería un ejemplo básico para identificar el label y obtener su texto en la aplicación compilada:
Código (vbnet) [Seleccionar]

Imports Windows
Imports Windows.Automation

...

Dim pid As Integer = Process.GetProcessesByName("WpfApplication1").Single().Id

Dim parentConditions As New OrCondition({
   New PropertyCondition(AutomationElement.ProcessIdProperty, pid, PropertyConditionFlags.None),
   New PropertyCondition(AutomationElement.NameProperty, "Mi Ventana", PropertyConditionFlags.IgnoreCase)
})

Dim labelConditions As New AndCondition({
   New PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Text, PropertyConditionFlags.None),
   New PropertyCondition(AutomationElement.RuntimeIdProperty, {7, 5924, 9119245}, PropertyConditionFlags.None)
})

Dim parentElement As AutomationElement = AutomationElement.RootElement.FindFirst(TreeScope.Children, parentConditions)
Dim labelElement As AutomationElement = parentElement.FindFirst(TreeScope.Children, labelConditions)

If (labelElement IsNot Nothing) Then
   Dim labelText As String = labelElement.Current.Name
   Console.WriteLine(labelText)
End If


Nótese que en el código de arriba la condición de RuntimeIdProperty está hardcodeada, el label de tu aplicación tendrá otra Id asignada (lo puedes averiguar facilmente con UI Inspect, o en tiempo de ejecución con la función AutomationElement.GetRuntimeId) ...igual que el nombre del executable y el título de la ventana,
y dependiendo de la estructura de la aplicación seguramente debas añadir condiciones adicionales para identificar el espacio de trabajo y/o ventana donde se encuentre ese label.

Saludos.

En primer lugar muchas gracias por tu respuesta Elektro, la verdad que siempre eres de gran ayuda, gracias.

Y bueno, ahora tengo que decir que he estado probando lo que tu muy bien me explicaste y no ha habido manera de conseguir sacar el texto de los labels que busco, ya que ni soy capaz de identificarlos por código.
Y lo más gracioso es que en el inspect si que aparecen perfectamente identificados, y como hijos de la ventana que yo examino pero a mi nada, incluso metiendo la condicion de búsqueda "Condition.TrueCondition" para que me saque todos, no hay manera.
Me pasa como les pasa a este y este, que por lo que he podido comprobar es que se puede acceder a ellos de forma managed o unmanaged, y esta segunda es la forma en la que accede Inspector a los elementos, pero ni idea de como tendría que proceder en mi código para hacer eso, no he encontrado nada, salvo esta librería que por algún lado comentaban que servía para algo sobre el tema, pero no se yo... xdd
No se si te habrás topado tu con este problema alguna vez, o sabrías decirme que puedo hacer.

Muchas gracias de nuevo!
#6
Hola chicos, quería plantearos la siguiente pregunta, ya que no ha habido manera de encontrar nada por todo internet :S

Mi duda es como podría obtener el texto de un label wpf (textblock) de una aplicación externa.
Lo que si que he podido ver usando spy++ es que aunque mire diferentes labels, todas las identifica con la misma ventana (class HwndWrapper), por lo que entiendo que no está identificando la label en si sino la ventana general que las alberga.
También decir que he encontrado una herramienta (que hace las veces de spy) para identificar elementos wpf, y si que me saca el texto, etc. La herramienta es snoop, pero desde mi propio código c# no se si existiría alguna forma o api o algo para sacarlo, sin que tenga que ser recurriendo a inyección dll, api hooking, ni nada similar.

Decir que para controles estándar no tengo ningún problema para obtenerlo, mediante las llamadas a las diferentes funciones de user32 para obtener el handle, clase, texto, etc etc, pero esto se me escapa...

Un saludo y a ver si me podéis echar un cable! ;)
#7
Se agradece mucho tus ganas de enseñar ;)

Mil gracias!
#8
Gran tutorial.
Ya he leído gran parte y seguiré en otro momento para terminarlo sin duda. Yo ya usaba el CE para sacar pointers y tal, pero el tema de la disección de estructuras y demás nunca lo había hecho, pero la verdad que está muy interesante.

Buen trabajo Mad!
#9
Si no estoy equivocado, lo podrías capturar de igual manera que capturas el código de la web al hacer una petición http desde .net, es decir, el código del javascript es parte del código de la web, lo único que visualmente lo ves como una ventanita a parte, pero es código también
#10
Se ve perfectamente que no entiendes para nada en lenguaje, ya que no sabes donde se coloca nada, como donde colocar la importación de librerías, la declaración de las clases, la declaración de variables, etc. Así es que lo que te recomendaría, si necesitas un autoclick, que te descargues uno hecho ya (el ejecutable) y lo uses, y si lo que quieres es aprender el lenguaje, creo que esto no es un buen comienzo, sino que empieces por aprender las bases del lenguaje en si.

Un saludo! ;)




Por cierto, con respecto a lo último que preguntas, como puedes ver no has colocado el método esperar dentro de ninguna clase, ya que justamente una linea antes de la declaración de ese método estás cerrando tu clase Form1 (con End Class), por lo que ese método tendrás que colocarlo justo antes de "End Class". Pero vamos, el método esperar tampoco lo usas en ningún sitio xdd

Y por cierto, engelx, en cuanto a la velocidad del autoclick, supongo que le bastará con cambiarle el interval al propio timer, no? puesto que en su código está utilizando un Timer :)




[MOD]: No hagas doble post.