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

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

В C#, используя 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] Установлен InputSimulator через NuGet, нет доступных участников и https://inputsimulator.codeplex.com/

1 ответ

Решение

Форма, которая содержит кнопку, не должна быть окном переднего плана. Для этого нужно добавить 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;
    }
}
Другие вопросы по тегам