C# - 将键盘事件发送到(最后)所选窗口

时间:2010-05-08 20:45:03

标签: c#

我想在Windows中使用虚拟键盘程序集http://www.codeproject.com/KB/miscctrl/touchscreenkeyboard.aspx,就像在屏幕键盘(OSK.exe)上一样。有人可以告诉我如何使用它,以便它始终保持在顶部,但用户可以在dekstop上选择其他窗口进行键盘输入,就像Windows中的“屏幕键盘”,具体我不知道如何选择最后选择的窗口(不能只使用GetForegroundWindow或GetFocus,因为当用户点击虚拟键盘时它会聚焦并且我自己处理键盘窗口)? 这对我来说非常紧迫,所以任何建议都会受到高度赞赏。

提前致谢。

3 个答案:

答案 0 :(得分:4)

您需要做的是让您的窗口无法激活。通过覆盖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消息来解决此问题。

答案 1 :(得分:1)

当您获得输入焦点时,Windows消息WM_SETFOCUS将被发送到您的窗口,并且.net将其转换为您收到的Forms事件。 Windows消息包含上一个输入焦点窗口的句柄。

如果您的C#Form.Activated或Control.Enter / Control.GotFocus事件中没有此信息,那么您可能需要覆盖Form.WndProc以捕获原始Windows消息并检索句柄 - 然后您可以用于激活或发送WM_KEYDOWN消息到上一个输入焦点窗口。

答案 2 :(得分:0)

在C#中向另一个应用程序发送击键次数
http://www.codeproject.com/KB/cs/SendKeys.aspx

然后,您只需要一种从虚拟键盘中选择另一个窗口的方法。要做到这一点,你只需要目标窗口的标题。