将密钥发送到非活动窗口?
问题描述:
我想发送像“a”这样的按键,而不是像我的应用程序中的按键Shift键,这就像屏幕键盘。我用这个代码,但它不工作:将密钥发送到非活动窗口?
IntPtr p = FindWindow(null, <myWindowTitle>);
ShowWindow(GetWindow(p, 3), 5);
SendKeys.SendWait("a");
但仍然我不能发送密钥到以前的窗口!
答
你所描述的实际上并不像屏幕键盘。它将按键发送到活动的窗口。请注意,OSK永远不会收到输入焦点,这完全是由设计决定的。
SendKeys
只发送输入到活动窗口。在Windows UI模型中,这是唯一可以接收键盘/鼠标输入的窗口。首先,“积极”/“聚焦”窗口的区别就在于这一点。
很难为您的问题提出一个替代解决方案,而无法准确知道您要完成的任务。一些想法:
没有理由重新实现OSK;它与所有版本的Windows捆绑在一起,所以你可以简单地使用
Process.Start
来启动它,并确保所有的都可以正常工作。如果做需要做这样的事情你自己,看看抄袭其设计,防止您的输入窗口从不断接收焦点。这将强制接收键盘事件的窗口保持焦点并允许它接收该输入。
或者,您可以调用
SetForegroundWindow
function来激活用于接收键盘输入的窗口,但我不建议这样做。
是的正是我正在制作一个屏幕键盘,所以我想发送按键到非活动窗口,如果我的应用程序最小化将被激活。我应该怎么做? Process.Start与此问题无关,并且SetForegroundWindow函数仅使其更难,因为使用GetWindow更简单一些。谢谢 – Peyman 2012-02-09 09:57:16
@Peyman:'Process.Start'是这个世界上最相关的东西。你正在寻找的代码是'Process.Start(“osk.exe”)'。正如我所提到的,Windows包括所有版本的屏幕键盘应用程序。你可以依靠它在那里,并依靠它工作。不要重新发明轮子。你的评论只是重申了问题所在;我已经解释了为什么这不起作用。 – 2012-02-09 17:26:03
抱歉,但我真的不知道我应该怎么做才能将键发送到上一个活动窗口,让我们想要精确地开发一个屏幕上的键盘。如何Process.Start(“osk.exe”);可以帮助我做到这一点? – Peyman 2012-02-09 18:04:41