创建虚拟小键盘:停止激活/聚焦表单

时间:2009-05-14 18:21:45

标签: c# winforms

我想创建一个虚拟小键盘,类似于屏幕键盘。如何防止表单被激活/聚焦,以便当我按下它上面的按钮时,SendKeys.Send调用会转到正确的形式?我确定我必须使用非托管API,但除此之外我甚至不确定从哪里开始。谢谢你的帮助!

4 个答案:

答案 0 :(得分:1)

您可以通过覆盖受保护的CreateParams属性来控制表单的创建方式:

protected override CreateParams CreateParams {
  get {
    var cp = base.CreateParams;
    // Configure the CreateParams structure here
    return cp;
  }
}

我建议尝试以下风格:

int WS_EX_NOACTIVATE = 0x08000000;
cp.ExStyle = cp.ExStyle | WS_EX_NOACTIVATE;

WS_EX_NOACTIVATE样式可防止鼠标输入给出窗口焦点(例如,您可以使用它来创建类似工具提示的窗口。)

您可以将其与其他样式(例如WS_EX_TOPMOST)结合使用,以获得您所追求的行为。

答案 1 :(得分:0)

没有焦点的表单通常不会接收键盘输入。所以我不确定你是如何让这个工作的。

答案 2 :(得分:0)

如果小键盘只需要在你编写的应用程序中工作,你就可以跟踪最后一个有焦点的有效输入控件。这样你就不必担心窃取焦点。我最近通过将一堆TextBoxes的Enter事件订阅到相同的事件处理程序来做类似的事情,该事件处理程序将我的聚焦控制句柄设置为sender参数。这种确切的方法可能对您不起作用,但该方法可能会使其更容易。

答案 3 :(得分:0)

使用您编写的应用,请考虑观察者模式。

在一般情况下,您可以在键盘上添加一个订阅方法(也允许取消订阅)。对于您的按键事件处理,循环遍历所有订阅的代理,向其发送字符代码。

代码(主要来自内存,代码片段可能无法编译,但应该让你去)

delegate void KeyPadSubscription (char keyPressed);
List<KeyPadSubscription> subscriptions;

void KeyPress (object sender, KeyPressArgs e)
{
   foreach (KeyPadSubscription sub in subscriptions)
        sub (e.CharCode)
}

void Subscribe(KeyPadSubscription s)
{
    subscriptions.Add(s);
}

void Unsubscribe(KeyPadSubscription s)
{
    subscriptions.Remove(s);
}

在您的情况下,您可能不需要委托列表,属性就足够了。然后,当您的表单更改焦点时,活动表单会将其方法设置为键盘的委托。

void MyForm_Activated(...)
{
    //assumes keypad is global or static
    KeyPad.Subsribe (this.HandleKeyPadPress)
}