Отправка сообщений другим окнам - 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);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.5 из 5
Похожие ответы