Windows 在失去焦点时接受输入

Windows 在失去焦点时接受输入,windows,winapi,focus,unity3d,joystick,Windows,Winapi,Focus,Unity3d,Joystick,我从来没有问过一个关于堆栈溢出的问题,尽管几乎所有的编程问题我都在这里找到了答案。可悲的是,今天不是那种日子 我花了一整天的时间在谷歌上搜索,浏览win32 api,尝试各种各样的东西,但我就是找不到我想要的答案 情况是这样的:我创建了一个Unity项目,它使用来自操纵杆的输入,Unity之外还有其他组件,但这无关紧要,我的问题的基础是:如何让应用程序在失去焦点/不活动时继续接受输入 我知道这是可以做到的,因为Borderlands 2可以做到(我昨天第一次尝试寻找答案时发现了这一点,这让我很恼

我从来没有问过一个关于堆栈溢出的问题,尽管几乎所有的编程问题我都在这里找到了答案。可悲的是,今天不是那种日子

我花了一整天的时间在谷歌上搜索,浏览win32 api,尝试各种各样的东西,但我就是找不到我想要的答案

情况是这样的:我创建了一个Unity项目,它使用来自操纵杆的输入,Unity之外还有其他组件,但这无关紧要,我的问题的基础是:如何让应用程序在失去焦点/不活动时继续接受输入

我知道这是可以做到的,因为Borderlands 2可以做到(我昨天第一次尝试寻找答案时发现了这一点,这让我很恼火,因为这证明了有办法,但我没能找到)

至少如果有人知道如何在鼠标或键盘上实现这一点,这将非常有帮助,让我知道如何将其应用到操纵杆上

一些有用的细节:我是一名热心且经验丰富的程序员,多年来我一直在用C/C++、C#、Java和许多脚本语言编写代码。这是我的业余爱好,我的工作,我的业余时间,当我睡觉的时候

我做过/尝试过的事情:

  • 使用
    user32
    中的
    SetFocus
    +
    SetActive
    作为窗口传递
    null
    失去焦点
  • WM_KILLFOCUS
    添加到我想在后台读取输入的另一个窗口的忽略列表中
  • 使用
    sendmessage
    诱使另一个窗口读取输入
  • 覆盖应用程序的
    inputstream
    (但这是无用的感觉,我不知道如何发送操纵杆输入) 流,也因为它仍然没有解决问题 如果其他应用程序不对焦(即打开记事本), 输入将停止

  • 我还寻找了一种让Unity独立游戏/项目/应用程序在后台接受输入的方法,但没有任何结果


我不知道是否有与Unity相关的解决方案,但无论你的应用程序是否处于焦点,你都可以使用直接从鼠标/操纵杆/HID硬件接收事件。

我真的认为@RemyLebeau给出的答案是跟踪输入的正确方法。如果你是黑客,你可以使用
GetForegroundWindow
GetWindowThreadProcessId
AttachThreadInput
以附加到活动UI线程。但随后需要“拉动”输入状态(例如,使用
GetKeyState
GetKeyboardState
GetKeyboardState
)并在切换线程以分离/附加到新线程时跟踪焦点。您可以等待(例如,使用
GetMessage
)对于发布到不同线程的输入消息。

哦,还有一件事:我真的不想使用第三方应用程序来完成这项任务,这在一定程度上破坏了我的整个痛苦。可能的重复,尽管这可能不是您希望的答案:(不:/…我以前看过,但正如前面提到的,事实上可能在某种程度上我的示例不存在…我研究了如何使用附加线程输入等,但它只对键盘/鼠标输入有用,正如您所说,您必须跟踪前景窗口,如果没有窗口处于活动状态,则会丢失输入t连接到系统线程[off-topic]当您的应用程序不是用户的活动应用程序时,为什么要窃取操纵杆输入?[/off-topic]因为,例如,如果你有一个设置,其中有一个外部接口,你希望能够控制应用程序,而焦点集中在外部接口上。我确实查看了RawInput API,并尝试使用它,就在昨天晚上,我无法弄清楚如何将输入推送到Unity应用程序并正确接收。我们在发送输入时,我试图将从操纵杆收到的任何信息发送给unity,但unity没有做出反应……可能是因为我创建的用于提取输入并将其转发的服务被UIPI阻止了吗?这是新的一天,所以也许我会比昨天更幸运。如果你指的是实际的后台服务,那么它会自行运行桌面会话,无法向其他桌面会话发送窗口消息。但是,为什么您不尝试在单独的服务中捕获输入,而不是从需要输入的应用程序中捕获输入?您是否确保启用了
后台运行
?可在
编辑->项目设置->播放器
@Jerdak找到。是的,我想我已经找到了答案不要认为我正确地将输入发送到unity,我现在正在测试。@RemyLebeau项目有多个部分,每个部分都需要来自不同来源的输入,这就是为什么我使用一个单独的应用程序,在后台运行,并将输入推送到适当的部分。