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