将密钥发送到非活动窗口?

问题描述:

我想发送像“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来激活用于接收键盘输入的窗口,但我不建议这样做。

+0

是的正是我正在制作一个屏幕键盘,所以我想发送按键到非活动窗口,如果我的应用程序最小化将被激活。我应该怎么做? Process.Start与此问题无关,并且SetForegroundWindow函数仅使其更难,因为使用GetWindow更简单一些。谢谢 – Peyman 2012-02-09 09:57:16

+0

@Peyman:'Process.Start'是这个世界上最相关的东西。你正在寻找的代码是'Process.Start(“osk.exe”)'。正如我所提到的,Windows包括所有版本的屏幕键盘应用程序。你可以依靠它在那里,并依靠它工作。不要重新发明*。你的评论只是重申了问题所在;我已经解释了为什么这不起作用。 – 2012-02-09 17:26:03

+0

抱歉,但我真的不知道我应该怎么做才能将键发送到上一个活动窗口,让我们想要精确地开发一个屏幕上的键盘。如何Process.Start(“osk.exe”);可以帮助我做到这一点? – Peyman 2012-02-09 18:04:41