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