我正在用 C# 构建一个自定义的虚拟键盘。
要点是将特定的按键发送到当前具有焦点的窗口。但是,通常情况下,虚拟键盘上的键在按下后会获取焦点。
我假设应该为此目的使用某种 Windows API。如果是,是哪一个,如果不是,正确的做法是什么?
我正在用 C# 构建一个自定义的虚拟键盘。
要点是将特定的按键发送到当前具有焦点的窗口。但是,通常情况下,虚拟键盘上的键在按下后会获取焦点。
我假设应该为此目的使用某种 Windows API。如果是,是哪一个,如果不是,正确的做法是什么?
这是关于这个主题的一个很好的资源:http ://www.yortondotnet.com/2006/11/on-screen-keyboards.html
基本上,创建一个表单并为键使用标签而不是按钮。您将需要覆盖 CreateParams 以设置正确的样式。您还必须重写 WndProc 并过滤掉通常将焦点发送到表单的消息。然后将点击事件添加到您的标签并用于SendKeys.Send(keyPressed);
将实际击键发送到具有焦点的窗口。
以下是链接中的相关代码:
private const int WS_EX_NOACTIVATE = 0x08000000;
protected override CreateParams CreateParams
{
get
{
CreateParams createParams = base.CreateParams;
createParams.ExStyle = createParams.ExStyle | WS_EX_NOACTIVATE;
return createParams;
}
}
private const int WM_MOUSEACTIVATE = 0x0021;
private const int MA_NOACTIVATE = 0x0003;
protected override void WndProc(ref Message m)
{
//If we're being activated because the mouse clicked on us...
if (m.Msg == WM_MOUSEACTIVATE)
{
//Then refuse to be activated, but allow the click event to pass through (don't use MA_NOACTIVATEEAT)
m.Result = (IntPtr)MA_NOACTIVATE;
}
else
base.WndProc(ref m);
}
我在面板(keyb)中使用面板(用于键)和自定义绘制例程来在中心绘制文本。
点击事件是 SendKeys.Send("1"); ETC..
这是一个 10 键控制,所以连接事件非常容易。
不必处理任何窗口消息,而且效果很好。我的 10 键没有任何焦点问题,输入会发送到光标所在的位置。简单的。