Título: Snippet para obtener handle de procesos Publicado por: Lekim en 21 Noviembre 2015, 06:18 am Hola
Iré al grano, utilizando la función Process.GetProcesses() puedo obtener información del los procesos del sistema así como el Handle o el MainWindowHandle de la ventana principal de un proceso. El problema es que en algunos casos MainWindowHandle devuelve 0 Recordé un viejo código de VB que tenía por ahí. Y tras un buen rato probando lo conseguí pasar a VB.NET, ya que usa APIs y si no se usa bien devuelve error o valores nulos. Se necesita el ID de un proceso para obtener el handle principal, y dado que la clase Process no devuelve valor nulo con los IDs obtengo todos los Handles en la lista. Ahí va el code ;): ////OBTENER HANDLE PROCESO//// Código
Aquí un ejemplo de como usarlo para obtener una lista con los procesos en ejecución sus handles y su Class Name. Código
Como demostración he hecho que se muestre en una columna los handles obtenidos con la clase Process y otra columna con los handles obtenidos con el snippet. Se puede ver que con algunos procesos ocultos, es decir no son visibles, se devuelve valor 0, pero con el snippet se obtiene el handle sin problemas. Además se obtienen los nombres de clase (ClassName) que sin los Handles de las ventanas no es posible obtenerlos. Por lo menos que yo sepa. La primera columna ClassName se obtiene con MainWindowHandle del Procces. La segunda columna ClassName se obtiene con los handles obtenidos con el snippet. Si hay otra forma más sencilla, decídmelo :-* El código original VB6 está en el siguiente enlace: CodeVB (http://www.mvp-access.es/buho/ficheros/apiprogramacargado.txt) Espero que os sirva... Saludos Título: Re: Snippet para obtener handle de procesos Publicado por: Eleкtro en 25 Noviembre 2015, 16:03 pm Es útil, funciona muy bien hasta donde lo he testeado.
Yo uso la parte importante del código que has mostrado (función GetProcessHandle) para obtener el hwnd de la ventana principal de un proceso para cambiar la visibilidad de dicha ventana mediante la función Win32 ShowWindow. saludos Título: Re: Snippet para obtener handle de procesos Publicado por: Lekim en 25 Noviembre 2015, 17:18 pm Es útil, funciona muy bien hasta donde lo he testeado. Yo uso la parte importante del código que has mostrado (función GetProcessHandle) para obtener el hwnd de la ventana principal de un proceso para cambiar la visibilidad de dicha ventana mediante la función Win32 ShowWindow. saludos Hola Si te soy sincero, como conoces Net mucho más que yo pensé mostrarías una de tus perlas usando código Net para hacer lo mismo. Por eso dejé la coletilla: Código: Si hay otra forma más sencilla, decídmelo Y si no tu otro/a. XD Claro que no me refiero a reducir el código, sino al uso de alguna otra clase distinta a Process, u otra función. No entiendo porqué con la clase Process sólo se obtengan los handles de unos pero de otros no. sl2s Título: Re: Snippet para obtener handle de procesos Publicado por: Eleкtro en 25 Noviembre 2015, 18:01 pm Si te soy sincero, como conoces Net mucho más que yo pensé mostrarías una de tus perlas usando código Net para hacer lo mismo. Por eso dejé la coletilla: Si hay otra forma más sencilla, decídmelo Claro que no me refiero a reducir el código, sino al uso de alguna otra clase distinta a Process, u otra función. Hombre, con las classes de Windows UI Automation se puede reemplazar todo ese p/invoking de tu código para hacer practicamente cualquier tipo de Spy y automación en las ventanas, pero hay un gran problema, UI Automation descarta las ventanas ocultas así que la única manera posible que se me ocurre para obtener el hwnd de una ventana OCULTA sería mediante código no administrado, como ya has mostrado. Para todo lo demás puedes usar Windows UI Automation. Edito: Te muestro un ejemplo que simularia la función Process.GetProcessById para obtener una representación del proceso (o mejor dicho de la ventana) y así el hwnd de la ventana: Código
Yo según que cosas prefiero utilizar la API de Windows, ya que el manejo de UI Automation se puede volver demasiado tedioso. No entiendo porqué con la clase Process sólo se obtengan los handles de unos pero de otros no. Si vieras detenidamente el código fuente de la class process de .Net framework lo entenderías (la referencia online u offline del código fuente), simplemente se devuelve un handle nulo (IntPtr.Zero) a cualquier ventana que esté oculta, ahora, el "por qué" ...¿quien sabe?, probablemente serán cuestiones de diseño de Microsoft, al igual que UI Automation no trabaja con ventanas ocultas quien sabe por qué (cuando perfectamente podría, ya que la API de Windows puede), algún motivo tendrán, digo yo. Saludos |