Necesito simular una pulsación de tecla en una aplicación de un tercero. Digamos que tengo una aplicación C# que necesita enviar un "8" a la aplicación Calculadora. No puedo usar SendKeys de .Net o keybd_event de win32 api porque ambos requieren que la ventana sea la superior activa, lo que no es el caso en mi situación.No puedo entender cómo usar las llamadas a SendMessage o PostMessage
Eso me deja con las llamadas sendMessage y postMessage. He estado tratando en las últimas tres horas tratando de obtener algunos resultados, pero ahora mismo estoy completamente perdido.
Tengo el siguiente:
[DllImport("user32.dll")]
public static extern int FindWindow(string lpClassName,string lpWindowName);
[DllImport("user32.dll")]
public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
public static extern bool PostMessage(int hWnd, uint Msg, int wParam, int lParam);
private void button1_Click(object sender, EventArgs e)
{
const int WM_KEYDOWN = 0x100;
const int WM_SYSCOMMAND = 0x018;
const int SC_CLOSE = 0x053;
int WindowToFind = FindWindow(null,"Calculator");
int result = SendMessage(WindowToFind, WM_SYSCOMMAND, SC_CLOSE, 0);
Boolean result2 = PostMessage(WindowToFind, WM_SYSCOMMAND, SC_CLOSE, 0);
int result3 = SendMessage(WindowToFind, WM_KEYDOWN,((int)Keys.NumPad7), 0);
Boolean result4 = PostMessage(WindowToFind, WM_KEYDOWN, ((int)Keys.NumPad7), 0);
}
Como se puede ver, hago cuatro intentos de comunicarse con la calculadora. Usar sendMessage y PostMessage para cerrar la ventana y también para enviar la clave 7. Nada funciona. El método FindWindow funciona porque obtengo el controlador de la aplicación (incluso he intentado iniciar el proceso yo mismo y acceder a él con process.MainWindowHandler, pero no tuve suerte). No hay errores o excepciones, pero simplemente no hace nada en la Calculadora.
También he intentado exactamente lo mismo con el bloc de notas y nada ha cambiado demasiado.
Wow. ¿Eso funciono? Habla de una adivinación afortunada. Nunca he usado esos dos métodos particulares de win32. –
Estoy realmente en 32bits, pero funcionó sin embargo :) –
Oye, lo que funcione :) –