Введите символ в активном окне внешней программы
Примечание. Этот вопрос не является дубликатом, потому что я спрашиваю, как отправить окно, которое было / активно во время нажатия кнопки. Ответ, который был связан с, найдет окно и сделает его активным. Это другое.
В 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;
}
}