я пытаюсь отправить сообщения из одного приложения в другое.
Я думаю, что код работает отлично, и это не проблема, но текст отправляется не в то текстовое поле? Я посмотрел с помощью Spy ++, и у меня есть два текстовых поля в приложении 2, но для обоих текстовых полей я возвращаю один и тот же класс из Spy ++ ---> "WindowsForms10.EDIT.app.0.141b42a_r13_ad1" ...
Теперь мой главный вопрос: почему оба текстовых поля имеют один и тот же «класс» и как я могу это исправить? Спасибо
private const int WM_SETTEXT = 0x000C;
[DllImport("user32.dll")]
private static extern IntPtr FindWindow(string lpClassName,string lpWindowName);
[DllImport("User32.dll")]
private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindows);
[DllImport("User32.dll")]
private static extern Int32 SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, StringBuilder lParam);
private void button4_Click(object sender, EventArgs e)
{
IntPtr hWnd = FindWindow(null, "Form1");
if (!hWnd.Equals(IntPtr.Zero))
{
IntPtr edithWnd = FindWindowEx(hWnd, IntPtr.Zero, "WindowsForms10.EDIT.app.0.141b42a_r13_ad1", null);
if (!edithWnd.Equals(IntPtr.Zero))
SendMessage(edithWnd, WM_SETTEXT, IntPtr.Zero, new StringBuilder("Hello World!"));
}
}
// Рабочий материал ...
IntPtr edithWnd = FindWindowEx(hWnd, IntPtr.Zero, "WindowsForms10.EDIT.app.0.141b42a_r12_ad1", null);
IntPtr nextHnd = edithWnd;
IntPtr editWnd = FindWindowEx(hWnd, nextHnd, "WindowsForms10.EDIT.app.0.141b42a_r12_ad1", null);
IntPtr nextHnd1 = editWnd;
IntPtr editWnd1 = FindWindowEx(hWnd, nextHnd1, "WindowsForms10.EDIT.app.0.141b42a_r12_ad1", null);
IntPtr nextHnd2 = editWnd1;
IntPtr editWnd2 = FindWindowEx(hWnd, nextHnd2, "WindowsForms10.EDIT.app.0.141b42a_r12_ad1", null);
@rene Спасибо, теперь это работает (редактировать: рабочий материал), и надеюсь, что это правильный путь :)
@rene Осталась еще одна проблема: / Не могу получить новую строку? новый StringBuilder («Hello World!» + Environment.NewLine)); или новый StringBuilder ("Hello World! \ r \ n")); не работает в другом приложении :(
Если это текстовое поле не настроено как Multiline, я не думаю, что вы увидите эту новую строку.
@rene, это тоже была моя первая мысль, но я уже активировал Multiline; S





Вы можете перебрать все запущенные процессы, а затем получить MainWindowHandle для другого экземпляра, сравнив идентификаторы процесса (чтобы исключить текущий процесс). Ваш первый вызов FindWindow может стать
FindWindowxEx(process.MainWindowHandle, IntPtr.Zero, "Form1", null);.