Мне нужно смоделировать нажатие клавиш в стороннем приложении. Допустим, у меня есть приложение на C #, которое должно отправить «8» в приложение калькулятора. Я не могу использовать SendKeys из .Net или keybd_event из win32 api, потому что им обоим нужно, чтобы окно было верхним активным, что не так в моей ситуации.
Так что это оставляет меня с вызовами sendMessage и postMessage. Последние три часа я пытался добиться каких-то результатов, но сейчас я совершенно безнадежен.
У меня есть следующее:
[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);
}
Как видите, я делаю четыре попытки связаться с Калькулятором. Использование sendMessage и PostMessage для закрытия окна, а также для отправки ключа 7. Ничего не работает. Метод FindWindow работает, потому что я получаю обработчик приложения (я даже пытался запустить процесс сам и получить к нему доступ с помощью process.MainWindowHandler, но не повезло). Там нет ошибок или исключений, но это просто ничего не делает в калькуляторе.
Я тоже пробовал делать то же самое с помощью блокнота, но ничего не изменилось.