elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Consulta Coordenadas de Ventana en segundo plano
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Consulta Coordenadas de Ventana en segundo plano  (Leído 3,211 veces)
rigorvzla

Desconectado Desconectado

Mensajes: 221


Ver Perfil
Consulta Coordenadas de Ventana en segundo plano
« en: 17 Marzo 2019, 22:44 pm »

Hola amigos, tengo una gran pregunta y duda, estoy haciendo un autoclicker (si se que existen muchos por ahi) pero este cumple exigencias particulares, y es que pueda enviar el click  a una aplicacion especifica en segundo plano SIN colocar el raton osea el puntoro real.

el programa en si ya esta... la parte de enviar el click al proceso podria decirse que si, mas no se, como a un proceso especifico, o bueno en este caso la ventana de dicho proceso  se clicke en un punto especifico de dicha ventana, imagino que es el principio de enviar una pulsacion de tecla , el click, eso lo se pero no sabria como empezar con las coordenadas de laventana o mas aun en segundo plano (minimizada).

Gracias de antemano


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: Consulta Coordenadas de Ventana en segundo plano
« Respuesta #1 en: 18 Marzo 2019, 12:09 pm »

Para enviar pulsaciones ya sea del teclado o el ratón a una ventana minimizada, puedes usar la función PostMessage de la API de Windows:


Pasos a seguir para enviar la pulsación del botón izquierdo del ratón a una ventana minimizada:

  • Localizar la ventana que pretendes clickar, ya sea la ventana principal de un proceso, o una ventana hija ( ej. la ventana de un botón ). Para esto último deberás documentarte sobre las funciones FindWindowEx, EnumWindows, EnumChildWindows y relacionadas, o bien puedes recurrir a la API administrada de Microsoft UI Automation:
  • Activar dicha ventana enviandole el mensaje de ventana WM_ACTIVATE.
     
  • Enviarle a esa ventana el mensaje WM_LBUTTONDOWN seguido de WM_LBUTTONUP; o solamente el mensaje BM_CLICK en el caso de tratarse de la ventana de un botón.

No caigas en el típico error de enviarle el mensaje WM_LBUTTONDOWN y WM_LBUTTONUP a la ventana principal de un proceso posicionando las coordenadas sobre un control/ventana hija para clickarlo, por que en principio eso no te va a funcionar así; tienes que enviarle los mensajes a la ventana exacta que pretendas clickar, insisto.



Aquí tienes todo lo necesario:

( código extraido de mi librería comercial DevCase for .NET Faamework y modificado para adaptarse a las circunstancias. )

NativeMethods.vb
Código
  1. ' ***********************************************************************
  2. ' Author   : ElektroStudios
  3. ' Modified : 14-March-2019
  4. ' ***********************************************************************
  5.  
  6. #Region " Option Statements "
  7.  
  8. Option Strict On
  9. Option Explicit On
  10. Option Infer Off
  11.  
  12. #End Region
  13.  
  14. #Region " Imports "
  15.  
  16. Imports System.Diagnostics.CodeAnalysis
  17.  
  18. #End Region
  19.  
  20. #Region " NativeMethods "
  21.  
  22. ' Namespace DevCase.Interop.Unmanaged.Win32
  23.  
  24. ''' ----------------------------------------------------------------------------------------------------
  25. ''' <summary>
  26. ''' Platform Invocation methods (P/Invoke), access unmanaged code.
  27. ''' <para></para>
  28. ''' This class does not suppress stack walks for unmanaged code permission.
  29. ''' <see cref="Global.System.Security.SuppressUnmanagedCodeSecurityAttribute"/> must not be applied to this class.
  30. ''' <para></para>
  31. ''' This class is for methods that can be used anywhere because a stack walk will be performed.
  32. ''' </summary>
  33. ''' ----------------------------------------------------------------------------------------------------
  34. ''' <remarks>
  35. ''' <see href="https://msdn.microsoft.com/en-us/library/ms182161.aspx"/>
  36. ''' </remarks>
  37. ''' ----------------------------------------------------------------------------------------------------
  38. Public NotInheritable Class NativeMethods
  39.  
  40. #Region " Constructors "
  41.  
  42.    ''' ----------------------------------------------------------------------------------------------------
  43.    ''' <summary>
  44.    ''' Prevents a default instance of the <see cref="NativeMethods"/> class from being created.
  45.    ''' </summary>
  46.    ''' ----------------------------------------------------------------------------------------------------
  47.    <DebuggerNonUserCode>
  48.    Private Sub New()
  49.    End Sub
  50.  
  51. #End Region
  52.  
  53. #Region " User32.dll "
  54.  
  55.    ''' ----------------------------------------------------------------------------------------------------
  56.    ''' <summary>
  57.    ''' Places (posts) a message in the message queue associated with the thread that created
  58.    ''' the specified window and returns without waiting for the thread to process the message.
  59.    ''' </summary>
  60.    ''' ----------------------------------------------------------------------------------------------------
  61.    ''' <remarks>
  62.    ''' <see href="https://msdn.microsoft.com/es-es/library/windows/desktop/ms644944%28v=vs.85%29.aspx"/>
  63.    ''' </remarks>
  64.    ''' ----------------------------------------------------------------------------------------------------
  65.    ''' <param name="hWnd">
  66.    ''' Handle to the window whose window procedure will receive the message.
  67.    ''' <para></para>
  68.    ''' If this parameter is <see cref="WindowMessages.HWND_Broadcast"/>,
  69.    ''' the message is sent to all top-level windows in the system,
  70.    ''' including disabled or invisible unowned windows, overlapped windows, and pop-up windows;
  71.    ''' but the message is not sent to child windows.
  72.    ''' </param>
  73.    '''
  74.    ''' <param name="message">
  75.    ''' Specifies the message to be sent.
  76.    ''' </param>
  77.    '''
  78.    ''' <param name="wparam">
  79.    ''' Specifies additional message-specific information.
  80.    ''' </param>
  81.    '''
  82.    ''' <param name="lparam">
  83.    ''' Specifies additional message-specific information.
  84.    ''' </param>
  85.    ''' ----------------------------------------------------------------------------------------------------
  86.    ''' <returns>
  87.    ''' If the function succeeds, the return value is <see langword="True"/>.
  88.    ''' <para></para>
  89.    ''' If the function fails, the return value is <see langword="False"/>.
  90.    ''' <para></para>
  91.    ''' To get extended error information, call <see cref="Marshal.GetLastWin32Error()"/>.
  92.    ''' </returns>
  93.    ''' ----------------------------------------------------------------------------------------------------
  94.    <SuppressMessage("Microsoft.Interoperability", "CA1401:PInvokesShouldNotBeVisible", Justification:="Visible for API users")>
  95.    <DllImport("User32.dll", SetLastError:=True)>
  96.    Public Shared Function PostMessage(ByVal hWnd As IntPtr,
  97.                                       ByVal message As Integer,
  98.                                       ByVal wparam As IntPtr,
  99.                                       ByVal lparam As IntPtr
  100.    ) As <MarshalAs(UnmanagedType.Bool)> Boolean
  101.    End Function
  102.  
  103.    ''' ----------------------------------------------------------------------------------------------------
  104.    ''' <summary>
  105.    ''' Sends the specified message to a window or windows.
  106.    ''' <para></para>
  107.    ''' The SendMessage function calls the window procedure for the specified window
  108.    ''' and does not return until the window procedure has processed the message.
  109.    ''' </summary>
  110.    ''' ----------------------------------------------------------------------------------------------------
  111.    ''' <remarks>
  112.    ''' <see href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms644950%28v=vs.85%29.aspx"/>
  113.    ''' </remarks>
  114.    ''' ----------------------------------------------------------------------------------------------------
  115.    ''' <param name="hWnd">
  116.    ''' A handle to the window whose window procedure will receive the message.
  117.    ''' </param>
  118.    '''
  119.    ''' <param name="msg">
  120.    ''' The message to be sent.
  121.    ''' </param>
  122.    '''
  123.    ''' <param name="wParam">
  124.    ''' Additional message-specific information.
  125.    ''' </param>
  126.    '''
  127.    ''' <param name="lParam">
  128.    ''' Additional message-specific information.
  129.    ''' </param>
  130.    ''' ----------------------------------------------------------------------------------------------------
  131.    ''' <returns>
  132.    ''' The return value specifies the result of the message processing; it depends on the message sent.
  133.    ''' </returns>
  134.    ''' ----------------------------------------------------------------------------------------------------
  135.    <SuppressMessage("Microsoft.Interoperability", "CA1401:PInvokesShouldNotBeVisible", Justification:="Visible for API users")>
  136.    <DllImport("User32.dll", SetLastError:=True)>
  137.    Public Shared Function SendMessage(ByVal hWnd As IntPtr,
  138.                                       ByVal msg As Integer,
  139.                                       ByVal wParam As IntPtr,
  140.                                       ByVal lParam As IntPtr
  141.    ) As IntPtr
  142.    End Function
  143.  
  144. #End Region
  145.  
  146. End Class
  147.  
  148. ' End Namespace
  149.  
  150. #End Region

NativeUtil.vb
Código
  1. ' ***********************************************************************
  2. ' Author   : ElektroStudios
  3. ' Modified : 09-September-2017
  4. ' ***********************************************************************
  5.  
  6. #Region " Option Statements "
  7.  
  8. Option Strict On
  9. Option Explicit On
  10. Option Infer Off
  11.  
  12. #End Region
  13.  
  14. #Region " Imports "
  15.  
  16. #End Region
  17.  
  18. #Region " Native Util "
  19.  
  20. ' Namespace DevCase.Interop.Unmanaged.Win32
  21.  
  22. ''' ----------------------------------------------------------------------------------------------------
  23. ''' <summary>
  24. ''' Contains win32 related utilites.
  25. ''' </summary>
  26. ''' ----------------------------------------------------------------------------------------------------
  27. ''' <remarks>
  28. ''' <see href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx"/>
  29. ''' </remarks>
  30. ''' ----------------------------------------------------------------------------------------------------
  31. Public NotInheritable Class NativeUtil
  32.  
  33. #Region " Constructors "
  34.  
  35.        ''' ----------------------------------------------------------------------------------------------------
  36.        ''' <summary>
  37.        ''' Prevents a default instance of the <see cref="NativeUtil"/> class from being created.
  38.        ''' </summary>
  39.        ''' ----------------------------------------------------------------------------------------------------
  40.        <DebuggerNonUserCode>
  41.        Private Sub New()
  42.        End Sub
  43.  
  44. #End Region
  45.  
  46. #Region " Public Methods "
  47.  
  48.        ''' ----------------------------------------------------------------------------------------------------
  49.        ''' <summary>
  50.        ''' Creates a (32-Bit Unsigned Integer) DWORD value from a LOWORD and a HIWORD.
  51.        ''' </summary>
  52.        ''' ----------------------------------------------------------------------------------------------------
  53.        ''' <example> This is a code example.
  54.        ''' <code>
  55.        ''' Dim value as UInteger = MakeDWord(UShort.MaxValue, UShort.MaxValue)
  56.        ''' </code>
  57.        ''' </example>
  58.        ''' ----------------------------------------------------------------------------------------------------
  59.        ''' <param name="loWord">
  60.        ''' The low-order WORD.
  61.        ''' </param>
  62.        '''
  63.        ''' <param name="hiWord">
  64.        ''' The high-order WORD.
  65.        ''' </param>
  66.        ''' ----------------------------------------------------------------------------------------------------
  67.        ''' <returns>
  68.        ''' The resulting DWORD value.
  69.        ''' </returns>
  70.        ''' ----------------------------------------------------------------------------------------------------
  71.        <DebuggerStepThrough>
  72.        Public Shared Function MakeDWord(ByVal loWord As UShort, ByVal hiWord As UShort) As UInteger
  73.            Dim loBytes As Byte() = BitConverter.GetBytes(loWord)
  74.            Dim hiBytes As Byte() = BitConverter.GetBytes(hiWord)
  75.            Dim combined As Byte() = loBytes.Concat(hiBytes).ToArray()
  76.  
  77.            Return BitConverter.ToUInt32(combined, 0)
  78.        End Function
  79.  
  80.        ''' ----------------------------------------------------------------------------------------------------
  81.        ''' <summary>
  82.        ''' Creates a lParam value from two <see cref="System.Int32"/> values.
  83.        ''' <para></para>
  84.        ''' You must call this method overload if you need to use negative values.
  85.        ''' <para></para>
  86.        ''' <seealso cref="Windows.Forms.Message.LParam"/>
  87.        ''' </summary>
  88.        ''' ----------------------------------------------------------------------------------------------------
  89.        ''' <remarks>
  90.        ''' <see href="https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-makelparam"/>
  91.        ''' </remarks>
  92.        ''' ----------------------------------------------------------------------------------------------------
  93.        ''' <example> This is a code example.
  94.        ''' <code>
  95.        ''' Dim lParam as IntPtr = MakeLParam(Integer.MaxValue, Integer.MaxValue)
  96.        ''' </code>
  97.        ''' </example>
  98.        ''' ----------------------------------------------------------------------------------------------------
  99.        ''' <param name="lo">
  100.        ''' The low-order <see cref="System.Int32"/> value.
  101.        ''' </param>
  102.        '''
  103.        ''' <param name="hi">
  104.        ''' The high-order <see cref="System.Int32"/> value.
  105.        ''' </param>
  106.        ''' ----------------------------------------------------------------------------------------------------
  107.        ''' <returns>
  108.        ''' The resulting lParam value.
  109.        ''' </returns>
  110.        ''' ----------------------------------------------------------------------------------------------------
  111.        <DebuggerStepThrough>
  112.        Public Shared Function MakeLParam(ByVal lo As Integer, ByVal hi As Integer) As IntPtr
  113.            Dim loBytes As Byte() = {BitConverter.GetBytes(lo)(0), BitConverter.GetBytes(lo)(1)}
  114.            Dim hiBytes As Byte() = {BitConverter.GetBytes(hi)(0), BitConverter.GetBytes(hi)(1)}
  115.            Dim combined As Byte() = loBytes.Concat(hiBytes).ToArray()
  116.  
  117.            Return New IntPtr(BitConverter.ToInt32(combined, 0))
  118.        End Function
  119.  
  120.        ''' ----------------------------------------------------------------------------------------------------
  121.        ''' <summary>
  122.        ''' Creates a lParam value from two <see cref="System.UInt16"/> values.
  123.        ''' <para></para>
  124.        ''' <seealso cref="Windows.Forms.Message.LParam"/>
  125.        ''' </summary>
  126.        ''' ----------------------------------------------------------------------------------------------------
  127.        ''' <remarks>
  128.        ''' <see href="https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-makelparam"/>
  129.        ''' </remarks>
  130.        ''' ----------------------------------------------------------------------------------------------------
  131.        ''' <example> This is a code example.
  132.        ''' <code>
  133.        ''' Dim lParam as IntPtr = MakeLParam(UShort.MaxValue, UShort.MaxValue)
  134.        ''' </code>
  135.        ''' </example>
  136.        ''' ----------------------------------------------------------------------------------------------------
  137.        ''' <param name="loWord">
  138.        ''' The low-order WORD.
  139.        ''' </param>
  140.        '''
  141.        ''' <param name="hiWord">
  142.        ''' The high-order WORD.
  143.        ''' </param>
  144.        ''' ----------------------------------------------------------------------------------------------------
  145.        ''' <returns>
  146.        ''' The resulting lParam value.
  147.        ''' </returns>
  148.        ''' ----------------------------------------------------------------------------------------------------
  149.        <DebuggerStepThrough>
  150.        Public Shared Function MakeLParam(ByVal loWord As UShort, ByVal hiWord As UShort) As IntPtr
  151.            Return New IntPtr(MakeDWord(loWord, hiWord))
  152.        End Function
  153.  
  154. #End Region
  155.  
  156.    End Class
  157.  
  158. ' End Namespace
  159.  
  160. #End Region
  161.  

+

( código hecho al vuelo. )

Código
  1. Const WM_ACTIVATE As Integer = &H6      ' https://docs.microsoft.com/en-us/windows/desktop/inputdev/wm-activate
  2. Const WM_LBUTTONDOWN As Integer = &H201 ' https://docs.microsoft.com/en-us/windows/desktop/inputdev/wm-lbuttondown
  3. Const WM_LBUTTONUP As Integer = &H202   ' https://docs.microsoft.com/en-us/windows/desktop/inputdev/wm-lbuttonup
  4. Const MK_LBUTTON As Integer = &H1       ' https://docs.microsoft.com/en-us/windows/desktop/inputdev/wm-lbuttondown
  5. Const BM_CLICK As Integer = &HF5        ' https://docs.microsoft.com/en-us/windows/desktop/controls/bm-click
  6.  
  7. Public Shared Sub SendLeftClickToWindow(ByVal hWnd As IntPtr, ByVal pt As Point)
  8.    Dim wParam As IntPtr = New IntPtr(MK_LBUTTON)
  9.    Dim lParam As IntPtr = NativeUtil.MakeLParam(pt.X, pt.Y)
  10.  
  11.    NativeMethods.SendMessage(hWnd, WM_ACTIVATE, IntPtr.Zero, IntPtr.Zero)
  12.  
  13.    NativeMethods.PostMessage(hWnd, WM_LBUTTONDOWN, wParam, lParam)
  14.    Thread.Sleep(100)
  15.    NativeMethods.PostMessage(hWnd, WM_LBUTTONUP, IntPtr.Zero, lParam)
  16. End Sub
  17.  
  18. Public Shared Sub SendLeftClickToButton(ByVal hWnd As IntPtr)
  19.    NativeMethods.SendMessage(hWnd, WM_ACTIVATE, IntPtr.Zero, IntPtr.Zero)
  20.    NativeMethods.PostMessage(hWnd, BM_CLICK, IntPtr.Zero, IntPtr.Zero)
  21. End Sub



Ejemplo para enviar la pulsación del botón izquierdo del ratón a la ventana principal de un proceso:
Código
  1. Dim hWnd As IntPtr = Process.GetProcessById(...).MainWindowHandle
  2. Dim pt As New Point(0, 0)
  3. SendLeftClickToWindow(hWnd, pt)

Ejemplo para enviar la pulsación del botón izquierdo del ratón a una ventana de tipo BUTTON:
Código
  1. Dim hWnd As IntPtr = New IntPtr(...)
  2. SendLeftClickToButton(hWnd)

Si necesitas usar coordenadas negativas (Int32), en principio la sobrecarga de la función NativeUtil.MakeLParam que he compartido debería funcionar correctamente (para ser sinceros no he testeado mucho esa sobrecarga), de lo contrario debes adaptar el código teniendo en cuenta lo siguiente:

Y aquí tienes algo más de info y ejemplos que publiqué en otra pregunta relacionada:

EDITO: acabo de darme cuenta de que eres el mismo usuario que publicó esa otra pregunta... joder entonces todo esto que expliqué ya deberías saberlo, jeje.

Eso es todo. Saludos.


« Última modificación: 18 Marzo 2019, 12:33 pm por Eleкtro » En línea



rigorvzla

Desconectado Desconectado

Mensajes: 221


Ver Perfil
Re: Consulta Coordenadas de Ventana en segundo plano
« Respuesta #2 en: 18 Marzo 2019, 14:54 pm »

calla elektro como siempre dando en el clavo, si en efecto era el otro ususario que pregunto lo del enviar una pulsacion a un proceso jejejje y si ya esa parte la sabia, de todos modos esta perfecta tu explicacion ya que me pone mas claro la respuesta, por otro lado, me surgio una pregunta.

Es posible enviar un click a la posicion X. Y especifica de una ventana minimizada sin maximizar?

Ejemplo: Tengo una ventana de un proceso de "notepad" quiero hacer click en el centro de la ventana, esta ventana esta minimizada y aun asi no fallar al enviar el click al proceso u coordenada especifica de ESA ventana.

Lograr esto es posible?

Yo, gracias a tu respuesta al tema anterior, logre enviar la pulsacion de tecla a un proceso que elijo de un listbox y resulto maravilloso, pero en el caso del click (lo veo mas complicado ya que es necesario elegir una posicion para hacer dicho click y lo veo dificil) es otro tema mas complicado y no se si se puede lograr.

Gracias por esta respuesta me da pie por donde empezar  a investigar.
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: Consulta Coordenadas de Ventana en segundo plano
« Respuesta #3 en: 18 Marzo 2019, 23:46 pm »

Es posible enviar un click a la posicion X. Y especifica de una ventana minimizada sin maximizar?

Sí, eso es lo que te acabo de explicar como hacer. Siempre puedes diseñar un Form de prueba con el que practicar enviandole mensajes con PostMessage y ver el comportamiento del Form al recibir estos mensajes de entrada del ratón cuando está minimizada, controlando los eventos Form.MouseDown, Form.MouseUp y Form.MouseClick o directamente el procedimiento de ventana WndProc. Pero vamos, que eso ya lo comprobé yo con una ventana minimizada y te aseguro que se puede clickar en X,Y coordenadas sin necesidad de maximizarla, de la forma que ya expliqué.

De todas formas siempre existe la rara posibilidad de que dependiendo de como haya sido programada una aplicación, la app pueda ignorar el input del teclado y/o ratón intencionadamente cuando está minimizada. Como alternativa a esto, siempre puedes colocar la ventana fuera de los límites visibles de la pantalla (off-screen), en vez de minimizarla.

Saludos.
« Última modificación: 19 Marzo 2019, 00:10 am por Eleкtro » En línea



rigorvzla

Desconectado Desconectado

Mensajes: 221


Ver Perfil
Re: Consulta Coordenadas de Ventana en segundo plano
« Respuesta #4 en: 19 Marzo 2019, 00:26 am »

Perfecto entocnes me pondre a leer esto para poder entebnderlo y teniendo en cuenta que programo en C# debere convertir todo esto para q pueda funcionarme gracias nuevamente elektro me pondre a ello inmediatamnete
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ficheros .bat en Segundo Plano?¿ « 1 2 »
Hacking
yisas_fight 14 38,746 Último mensaje 8 Septiembre 2011, 09:36 am
por WHK
exec en segundo plano
PHP
sexto 0 2,070 Último mensaje 11 Septiembre 2012, 13:02 pm
por sexto
segundo plano
Windows
makinavaja3500 2 3,184 Último mensaje 6 Diciembre 2012, 21:32 pm
por makinavaja3500
[BATCH] ¿Cómo ubicar la ventana en coordenadas específicas?
Scripting
cyberalejo17 4 10,932 Último mensaje 27 Abril 2014, 05:08 am
por cyberalejo17
Manipular ventana en segundo plano
.NET (C#, VB.NET, ASP)
rigorvzla 9 4,980 Último mensaje 10 Enero 2019, 00:06 am
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines