C# 创建虚拟numpad:阻止表单被激活/聚焦

C# 创建虚拟numpad:阻止表单被激活/聚焦,c#,winforms,C#,Winforms,我想创建一个虚拟numpad,类似于屏幕键盘。如何防止表单被激活/聚焦,以便当我按下表单上的按钮时,SendKeys.Send call会转到正确的表单?我确信我必须为此使用非托管API,但除此之外,我甚至不确定从何开始。谢谢你的帮助 没有焦点的窗体通常不接收键盘输入。因此,我不确定您将如何使其工作。如果numpad只需要在您编写的应用程序中工作,您可以跟踪上一个具有焦点的有效输入控件。这样你就不必担心什么东西偷走了你的注意力。我最近做了一些类似的事情,将一堆文本框的Enter事件订阅给同一个事

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

没有焦点的窗体通常不接收键盘输入。因此,我不确定您将如何使其工作。

如果numpad只需要在您编写的应用程序中工作,您可以跟踪上一个具有焦点的有效输入控件。这样你就不必担心什么东西偷走了你的注意力。我最近做了一些类似的事情,将一堆文本框的Enter事件订阅给同一个事件处理程序,该事件处理程序将我的焦点控制句柄设置为sender参数。这种精确的方法可能对你不起作用,但是这种方法可能会更容易。

你写的应用程序,考虑观察者模式。

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

代码(大部分来自内存,代码片段可能无法编译,但应该可以让您继续)


您可以通过覆盖受保护的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
)相结合,以获得您所追求的行为。

这适用于可与任何应用程序(如平板电脑上的虚拟键盘)配合使用的键盘,还是仅适用于您编写的应用程序?仅适用于我编写的应用程序。我重写了WndProc方法,将message.Result设置为MA_NOACTIVATE,但当我单击按钮时,表单似乎仍在获得焦点。
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;