C# - отправка событий клавиатуры в (последнее) выбранное окно

Я хочу использовать виртуальную клавиатуру в сборе, найденную здесь http://www.codeproject.com/KB/miscctrl/touchscreenkeyboard.aspx как на экранной клавиатуре (OSK.exe) в Windows. Может кто-нибудь, пожалуйста, скажите мне, как я могу использовать его так, чтобы он всегда оставался сверху, и при этом пользователь мог выбрать другие окна на декстопе для ввода с клавиатуры, точно так же, как "на экранной клавиатуре" в Windows, особенно я не знаю как выбрать последнее выбранное окно (нельзя использовать только GetForegroundWindow или GetFocus, потому что, когда пользователь нажимает на виртуальную клавиатуру, он фокусируется, и я получаю дескриптор самого окна клавиатуры)? Это очень срочно для меня, поэтому любые советы будут с благодарностью.

Заранее спасибо.

3 ответа

Решение

Что вам нужно сделать, это сделать ваше окно, что оно не может быть активировано. Это довольно легко сделать, переопределив CreataParams, Затем вы можете использовать SendKey.Send для отправки нажатий клавиш в текущее активное окно, ваше окно никогда не станет активным.

Вот простой пример

  public partial class Form1 : Form
  {
    const int WS_EX_NOACTIVATE = 0x08000000;

    public Form1()
    {      
      InitializeComponent();      
    }

    protected override CreateParams CreateParams
    {
      get
      {
        CreateParams param = base.CreateParams;
        param.ExStyle |= WS_EX_NOACTIVATE;
        return param;
      }
    }

    private void button1_Click(object sender, EventArgs e)
    {
      SendKeys.Send("A");
    }
  }

Вы заметите одну странную вещь: поскольку ваше окно никогда не становится активным, оно реагирует довольно странно, когда вы перетаскиваете окно. По сути, перетаскивание работает, оно просто не дает визуальной обратной связи во время перетаскивания. Вы можете решить эту проблему, переопределив WndProc и обработав сообщения WM_NCLBUTTONDOWN и WM_MOUSEMOVE.

Когда вы получаете фокус ввода, оконное сообщение WM_SETFOCUS отправляется в ваше окно, и.net преобразует это в события Forms, которые вы получаете. Сообщение windows содержит дескриптор предыдущего окна ввода-фокусировки.

Если эта информация недоступна в вашем событии C# Form.Activation или Control.Enter/Control.GotFocus, вам может потребоваться переопределить Form.WndProc, чтобы перехватить необработанное сообщение Windows и получить дескриптор, который затем можно использовать для активации или отправьте сообщения WM_KEYDOWN в предыдущее окно ввода-фокусировки.

Отправка нажатий клавиш в другое приложение на C#
http://www.codeproject.com/KB/cs/SendKeys.aspx

Затем все, что вам нужно, это способ выбрать другое окно на виртуальной клавиатуре. Для этого вам просто нужен заголовок целевого окна.

Другие вопросы по тегам