【问题标题】:I send a keystroke to a background process. It works if in the foreground but not in the background我将击键发送到后台进程。它在前台工作但在后台不工作
【发布时间】:2016-03-22 05:06:51
【问题描述】:

我正在编写一个应该在后台的可执行文件上运行的机器人。

SendMessage(hWnd, WM_KEYDOWN, ((IntPtr)k), (IntPtr)0);

上面的行将向进程发送一个密钥。如果我的光标在游戏的聊天框中,它会在聊天框中输入内容。

如果我不在聊天框中并发送它,它不会做任何事情,直到我进入它的过程,就像我按住那个键一样(我会朝着我持有的键的方向走)直到我按下我发送的键('s'是我正在使用的测试键)它将停止。我还尝试在使用 WM_KEYUP 标志后立即发送消息,但这并没有阻止任何事情。

SetForegroundWindow (hWnd);
SendMessage(hWnd, WM_KEYDOWN, ((IntPtr)k), (IntPtr)0);

此段将针对流程并开始移动。

我一直在互联网上试图弄清楚如何在后台进行这项工作,以及只发送 1 个输入。我已经搞砸了 spy++,但我认为如果它在我被选项卡进入时发送命令时有效,那一定是别的东西。

这是我与http://pastebin.com/Jbx9BfSm一起操作的完整课程

【问题讨论】:

    标签: c# process background sendmessage findwindow


    【解决方案1】:

    你需要在弹出窗体被带到前面后设置焦点窗口。 焦点窗口可以是按钮、列表框等

    Focus and window activation in Win32

    【讨论】:

    • 我会仔细阅读你的链接,但从你所说的来看,这听起来真的很混乱,哈哈。顺便说一句,我正在使用 Unity3D 创建 UI,所以它可能只是有点不同。
    • 将表单放在前面后,处理“已激活”事件。在此事件中,将焦点设置在您的聊天框编辑框上。即需要接收输入的控件。然后发送消息。您可能希望在设置 ForeGroundWindow 和 SendMessage 函数之间添加延迟,因为时间可能是问题
    • 所以该链接讨论了每个线程如何有另一个线程与之配套,一个用于窗口,另一个用于接收用户输入的线程。使用 spy++ 时,我的窗口没有子级。我会尝试设置延迟,但您介意详细说明您所说的“处理 'Activated' 事件”是什么意思吗?
    • 激活的事件。 msdn.microsoft.com/en-us/library/…我对您的问题的理解是,如果您的表单最初在后台,您可以激活表单,但击键不会到达预期的目的地。但是,如果您的表单最初位于前台并且焦点位于您的聊天框编辑控件上,那么会收到消息。所以我只是在想,当你处理你的 form_activated 事件时,将焦点设置在你的聊天框编辑框上然后发送消息
    • 哦,让我改写一下。当我发送消息时,当游戏客户端在聊天框中有光标时,它会在聊天框中显示我发送的字符(这是进程在后台时)。当光标不在聊天框中时,游戏会收到消息但不会对其进行任何操作,直到我将该游戏设置为前台目标,在这种情况下它将对我的按键做出反应。我不在乎聊天,我只是把它放在那里,因为我注意到它很有趣。
    猜你喜欢
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    相关资源
    最近更新 更多