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

.net 将密钥发送到非活动窗口?,.net,winforms,winapi,sendkeys,.net,Winforms,Winapi,Sendkeys,我希望在我的应用程序中发送像“a”这样的键,而不是像Shift这样的按键,这类似于屏幕键盘。我使用了此代码,但它不起作用: IntPtr p = FindWindow(null, <myWindowTitle>); ShowWindow(GetWindow(p, 3), 5); SendKeys.SendWait("a"); IntPtr p=FindWindow(null,); ShowWindow(GetWindow(p,3),5); SendKeys.SendWait(“a”

我希望在我的应用程序中发送像“a”这样的键,而不是像Shift这样的按键,这类似于屏幕键盘。我使用了此代码,但它不起作用:

IntPtr p = FindWindow(null, <myWindowTitle>);
ShowWindow(GetWindow(p, 3), 5);
SendKeys.SendWait("a");
IntPtr p=FindWindow(null,);
ShowWindow(GetWindow(p,3),5);
SendKeys.SendWait(“a”);

但我仍然无法将钥匙发送到上一个窗口

您所描述的实际上与屏幕键盘完全不同。它将按键发送到活动窗口。请注意,OSK永远无法实际接收输入焦点,这完全是出于设计

SendKeys
仅向活动窗口发送输入。在Windows UI模型中,这是唯一可以接收键盘/鼠标输入的窗口。这就是“活动”与“聚焦”窗口区别的关键所在

在不确切知道自己想要完成什么的情况下,很难提出解决问题的替代方案。一些想法:

  • 没有理由重新实施OSK;它与所有版本的Windows捆绑在一起,因此您只需使用
    进程启动它即可。启动
    并确保一切正常

  • 如果您确实需要自己做类似的事情,请考虑复制它的设计并防止您的输入窗口接收焦点。这将强制接收键盘事件的窗口保持焦点并允许其接收该输入

  • 或者,您可以调用来激活接收键盘输入的窗口,但我不建议这样做


是的,我正在制作屏幕键盘,所以我想将按键发送到非活动窗口,如果我的应用程序最小化,该窗口将被激活。我该怎么做?Start与这个问题无关,setForeGroundIndow函数只会使它变得更难,因为使用GetWindow更简单一些。thanks@Peyman:
过程。在这里,启动是世界上最相关的事情。您要查找的代码是
Process.Start(“osk.exe”)
。正如我提到的,Windows在所有版本中都包含一个屏幕键盘应用程序。你可以相信它在那里,也可以相信它在工作。不要重新发明轮子。你的评论只是重申了问题的作用;我已经解释了为什么这不起作用。对不起,我真的不知道我应该怎么做才能将按键发送到上一个活动窗口,让我们假设我想要开发一个精确的屏幕键盘。如何启动进程(“osk.exe”);能帮我吗?@Peyman:它给你一个屏幕键盘。问题解决了。正如我在回答中所指出的,您不能将密钥发送到以前的活动窗口,您只能将它们发送到活动窗口。你必须先激活它
setforegroundindow
就是这样做的一种方法。使用内置的OSK应用程序是一个更好的解决方案。有一个问题,当我更仔细地阅读您的答案时,我提到您正在描述一种情况,当我想将密钥发送到我自己的应用程序时,尽管如此,我还是想将它们发送到上一个活动窗口,正如这段代码所示,ShowWindow(hwnd,5);将显示并激活带有hwnd处理程序和GetWindow(hwnd,3)的窗口;将返回上一个活动窗口的hwnd,而不是当前活动应用的hwnd。