Windows系统编程:是否可以将按键发送到不是当前活动的应用程序?

我的Windows系统编程有点生疏

如果(打开的)目标应用程序当前没有焦点,程序是否有可能发送按键(我正在通过SendMessage() API调用来猜测)到另一个应用程序? 如果有可能,那么是否使目标应用程序成为活动应用程序,还是仍然保持在后台?

预先感谢您提供的任何信息!

从记忆:是的,没有。

您正在寻找WM_KEYDOWN:

 PostMessage(hwndOther, WM_KEYDOWN, VK_ENTER, 0); 

不,它不会改变焦点,除非后续的电话确定焦点。 它将保持相同的窗口顺序

 PostMessage(hwndOther, WM_KEYDOWN, VK_ENTER, 0); 

这适用于我,但只在Windows XP下。

但在Vista和Windows 7我也有问题。 与UIPI合作。 我试图发送一个消息来处理从一个DLL注入到这个过程。

如何解决它?

对于定向发送的按键,SendInput是本地方法的选择,虽然它受Vista / 2008 / W7上的UIPI(完整性级别)检查。 您无法将击键发送到IL>您的应用程序。

捕获和重定向输入的更一般的解决方案是全局键盘钩子(请参阅SetWindowsHookEx帮助)。 但是这是相当毛茸茸的东西 – 你必须应付如何发送击键,你影响系统中的每一个进程,因为你的代码被有效地插入输入流,它涉及到编写一个本地DLL …你必须知道正是你在做什么。

我们在我们的系统中使用全局键盘挂钩(我写了它),但是我们是一个特殊情况 – 一个单一功能的紧急呼叫处理系统。 我不会建议全局钩子作为通用Windows计算的解决方案。

你不需要SendInput()或钩子

PostMessage的答案是错误的。

你必须远程连接你的线程。 在Win32 api上看到它是一个非常经典的问题(C代码,右边的MS方法)

是的,你可以发送按键,不,它不会把另一个窗口顶部。

  • 一种方法是使用SendInput API函数 – 这里是一个如何在VB6(ulp!)中使用它的例子 。
  • 可能更容易使用直接从.NET Framework 3.0支持的GUI自动化 – 例如阅读这个 。