Введите символ в активном окне внешней программы

65
6

Note- Этот вопрос не является дубликатом, потому что я спрашиваю, как отправить в окно, которое было/активно во время нажатия кнопки. Ответ, который был связан, найдет окно и сделает его активным. Это другое.

В С#, используя Winforms, как я могу отправить символ в активное окно, например, в блокнот, когда нажата кнопка?

У меня есть форма, у которой есть кнопка. Открыв блокнот вручную (не из моей программы), я хочу щелкнуть по окну блокнота, чтобы активировать его, затем нажмите кнопку "Моя кнопка" и введите его в это активное окно, блокнот.

Я могу использовать собственную функциональность.NET и Sendkeys.Send("A")

или я могу сделать эти две строки, используя пакет InputSimulator, устанавливаемый через NuGet [1]

WindowsInput.InputSimulator s = new WindowsInput.InputSimulator();
s.Keyboard.TextEntry("A");

В любом случае, они не помещают персонажей в блокнот. Это может быть отчасти потому, что кнопка фокусируется.

Я могу сделать решение, упомянутое здесь, чтобы кнопка не фокусировалась (хотя это не останавливает мое окно программы от фокуса)

Как создать кнопку, которая может отправлять ключи в систему без потери фокуса - Виртуальная клавиатура

static void SetSty(Control control, ControlStyles flags, bool value)
{
Type type = control.GetType();
BindingFlags bindingFlags = BindingFlags.NonPublic | BindingFlags.Instance;
MethodInfo method = type.GetMethod("SetStyle", bindingFlags);
if (method != null)
{
object[] param = { flags, value };
method.Invoke(control, param);
}
}

и я могу позвонить

SetSty(button1, ControlStyles.Selectable, false);

С помощью этой технологии я могу щелкнуть текстовое поле в форме, а затем щелкнуть мышью по моей кнопке можно написать текст в это текстовое поле без потери фокуса из текстового поля.

Но это не работает для внешнего окна блокнота

Поэтому, если запустить блокнот (start..run..notepad), а затем нажать кнопку в моей программе, он отвлечет фокус от блокнота и не вводит текст в это активное окно блокнота.

[1] Установлен входной симулятор через NuGet, нет доступных членов и https://inputsimulator.codeplex.com

спросил(а) 2021-01-19T14:08:39+03:00 9 месяцев, 1 неделя назад
1
Решение
79

Форма, содержащая кнопку, должна быть исключена из окна переднего плана. Для этого вам нужно добавить WS_EX_NOACTIVATE в вашу форму:

private const int WS_EX_NOACTIVATE = 0x08000000;
protected override CreateParams CreateParams
{
get
{
CreateParams createParams = base.CreateParams;
createParams.ExStyle |= WS_EX_NOACTIVATE;
return createParams;
}
}

ответил(а) 2021-01-19T14:08:39+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема