Отправка сообщений другим окнам - C#
Формулировка задачи:
Здравствуйте! Проблема, которая у меня возникла, уже, в той или иной форме, многократно поднималась как на этом, так и на многих других форумах (см. пример Как программно нажать клавишу в другом прилжении). Однако у меня так и не получилось разобраться и работоспособного решения найдено не было. Задача состоит в том, чтобы отправить сообщение в окно блокнота. У меня получилось это сделать в связке SetForegroundWindow + SendKeys.SendWait. Но возникла необходимость в том, чтобы сообщения посылались даже тогда, когда это окно не открыто (например, находится в свёрнутом состоянии). Для этого советуют использовать SendMessage.
Однако тут возникают следующие сложности. У импортируемой библиотеки SendMessage существует множество вариаций по типам. Например, где-то перед lParam стоит int, где-то uint и т.д. Я опробовал много вариаций, однако ни одна из них не заработала. То есть окно блокнота открывается, но сообщения туда не посылаются. Также, в аргументах сендмессенджера есть штуки типа WM_KEYDOWN и т.д., интересно узнать, есть ли разница какие значения (0x100, 0x101: откуда берутся эти значения никто не пишет) им присваивать и что лучше всего использовать в случае, когда нужно отправить клавишу (WM_KEYDOWN?)?
Код на C#
Выше приложена часть кода, в которой делается попытка работы с сенмессенджером.
Буду крайне благодарен за дельные советы!
[DllImport("User32.dll")] static extern int SetForegroundWindow(IntPtr hWnd); [DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] internal static extern IntPtr SetFocus(IntPtr hwnd); [DllImport("user32.dll")] static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam); const int WM_KEYDOWN = 0x100; const int WM_KEYUP = 0x101; const int WM_CHAR = 0x105; const int WM_SYSKEYDOWN = 0x104; const int WM_SYSKEYUP = 0x105; private void readHandle_Click(object sender, EventArgs e) { StreamReader handleReader = new StreamReader(@"D:\Bloknotbot\Bloknotbot\Bloknotbot\windowsHandles\handles.txt"); string str = handleReader.ReadToEnd(); handleReader.Close(); int BloknotHandleInt = Convert.ToInt32(str); IntPtr BloknotHandle = (IntPtr)BloknotHandleInt; SetForegroundWindow(BloknotHandle); for (int i = 0; i < 5; i++) { //SendKeys.SendWait("{f5}"); SetFocus(BloknotHandle); SendMessage(BloknotHandle, WM_KEYDOWN, (int)Keys.F5, 0); Thread.Sleep(1000); } }
Решение задачи: «Отправка сообщений другим окнам»
textual
Листинг программы
using System.Runtime.InteropServices; ... [DllImport("user32.dll")] static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll")] static extern IntPtr FindWindowEx(IntPtr parentHandle, int childAfter, string className, string windowTitle); [DllImport("user32.dll")] static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam); const int WM_CHAR = 0x0102; .. IntPtr hWnd = FindWindow(null, "Безымянный — Блокнот"); IntPtr hWndEdit = FindWindowEx(hWnd, 0, "Edit", null); SendMessage(hWndEdit, WM_CHAR, 0x30, null);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д