public static extern int FindWindow(string lpClassName, String lpWindowName);
Para encontrar la ventana, se necesita el nombre de clase de la ventana.He aquí algunos ejemplos:
C#:
const string lpClassName = "Winamp v1.x";
IntPtr hwnd = FindWindow(lpClassName, null);
Ejemplo de un programa que hice, escrito en VB:
hParent = FindWindow("TfrmMain", vbNullString)
Con el fin de obtener el nombre de la clase de una ventana, que' Necesitará algo llamado Win Spy
Una vez que tenga el control de la ventana, puede enviar mensajes utilizando la función SendMessage (IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam).
hWnd, aquí, es el resultado de la función FindWindow. En los ejemplos anteriores, esto será hwnd y hParent. Le dice a la función SendMessage a qué ventana enviar el mensaje.
El segundo parámetro, wMsg, es una constante que indica el TIPO del mensaje que está enviando. El mensaje puede ser una pulsación de tecla (por ejemplo, enviar "la tecla enter" o "la barra espaciadora" a una ventana), pero también puede ser un comando para cerrar la ventana (WM_CLOSE), un comando para alterar la ventana (ocultarlo, muéstrelo, minimícelo, modifique su título, etc.), una solicitud de información dentro de la ventana (obtener el título, obtener texto dentro de un cuadro de texto, etc.), y así sucesivamente. Algunos ejemplos comunes incluyen los siguientes:
Public Const WM_CHAR = &H102
Public Const WM_SETTEXT = &HC
Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_CLOSE = &H10
Public Const WM_COMMAND = &H111
Public Const WM_CLEAR = &H303
Public Const WM_DESTROY = &H2
Public Const WM_GETTEXT = &HD
Public Const WM_GETTEXTLENGTH = &HE
Public Const WM_LBUTTONDBLCLK = &H203
Estos se pueden encontrar con un visor de API (o un simple editor de texto, como Bloc de notas) abriendo (Microsoft Studio Directorio de Visual)/Common/Herramientas/WINAPI/winapi32. TXT.
Los siguientes dos parámetros son ciertos detalles, si es necesario. En términos de presionar ciertas teclas, especificarán exactamente qué tecla específica se va a presionar.
C# ejemplo, configurar el texto de "WindowHandle" con WM_SETTEXT:
x = SendMessage(windowHandle, WM_SETTEXT, new IntPtr(0),
m_strURL);
Más ejemplos de un programa que hice, escrito en VB, fijando el icono de un programa (ICONBIG es una constante que se puede encontrar en winapi32.txt):
Call SendMessage(hParent, WM_SETICON, ICON_BIG, ByVal hIcon)
Otro ejemplo de VB, al pulsar la tecla de espacio (VK_SPACE es una constante que se puede encontrar en winapi32.txt):
Call SendMessage(button%, WM_KEYDOWN, VK_SPACE, 0)
Call SendMessage(button%, WM_KEYUP, VK_SPACE, 0)
VB enviar un clic de botón (botón izquierdo hacia abajo y luego hacia arriba):
Call SendMessage(button%, WM_LBUTTONDOWN, 0, 0&)
Call SendMessage(button%, WM_LBUTTONUP, 0, 0&)
Ni idea de cómo configurar el oyente dentro de un DLL, pero estos ejemplos deben ayudar en la comprensión de cómo enviar el mensaje.
Hola Nicole, SendMessage "podría" ayudar en este caso sí, pero me temo que no es la forma más fácil de alcanzar su objetivo. ¿Puedes describir un poco cuál es tu escenario completo? ¿Tiene 1 aplicación WindowsForms y algunas bibliotecas de clases que contienen formularios adicionales que le gustaría mostrar o, en caso negativo, qué está intentando hacer exactamente? Da más detalles y veremos qué camino tomar. –
Si tiene control en ambas aplicaciones, use alguna otra estrategia de IPC (named pipe/socket) –