keybd_event() 调用未发送到远程桌面
Posted
技术标签:
【中文标题】keybd_event() 调用未发送到远程桌面【英文标题】:keybd_event() calls not sending to remote desktop 【发布时间】:2014-11-21 12:55:17 【问题描述】:我正在尝试使用 keybd_event() 将某些键按到远程桌面应用程序。对于最简单的测试,我只是在远程会话中打开记事本,然后调用 keybd_event() 在本地计算机上运行,当前用户关注记事本。
不幸的是,它似乎没有将任何输入发送到远程桌面。
如果我在本地计算机上以记事本的本地实例为焦点运行应用程序,它会准确输入我想要输入的内容。
有没有人知道为什么这不起作用?显然我可以手动输入远程桌面会话。
谢谢
【问题讨论】:
右键单击并尝试以管理员身份运行您的程序?我在将按键事件和鼠标事件发送到任务管理器并以管理员身份运行时遇到问题。 感谢 Brandon 的回复,很遗憾我们已经尝试过,但无济于事。 你试过其他远程桌面程序吗? (例如 TeamViewer)标准 RDP 通常会出现问题,但其他程序通常没有这种奇怪的限制。 感谢@Ilya,很遗憾,这是不可能的,因为我们正在远程访问提供的 PaaS 服务器。所以本质上,我们必须使用 RDP... 嗯,它没有注册输入很奇怪..我无法测试它,因为我没有另一台电脑方便的atm..但是,您可以尝试使用 SetWindowsHookEx 并删除@ 987654322@ flag:msdn.microsoft.com/en-us/library/windows/desktop/… 也许它会注册为硬件事件并通过。不过,我不确定这是否真的是问题所在。 【参考方案1】:任何远程桌面程序都是连接远程系统的网关,它是一个中介。通过任何方法(如keybd_event
、SendInput
、PostMessage
等)向该程序发送任何键盘消息都会被 RDP 程序静默吸收。它根本不会消耗它,也不会将它传递给连接的资源。
很可能(我不确定),该程序可能已经记录了向其发送一些消息的 API,例如关闭会话、打开会话或发送消息到连接的会话。使用给定的 API(函数、COM 接口),您可以向连接的资源发送一些输入。
【讨论】:
由于远程桌面窗口仍然像任何其他窗口一样是本地窗口,我希望发送到此类窗口的输入消息会像任何其他窗口一样被解释为普通用户输入,并被传输到相应的远程机器。除非 RDP 使用SetWindowsHookEx()
或RegisterRawInputDevices()
来区分模拟输入和物理输入,这是有可能的。
假设您按下了 Ctrl+T 组合键。这会传递给远程吗?如果这是 RDP 应用程序本身的快捷方式怎么办?这只是说 RDP 应用程序将以自己的方式处理消息,并且只有在其决定时才会将其传输到远程。假设您编写这样的应用程序 - 您认为所有用户类型都会直接转到远程吗?如果有怎么办?以上是关于keybd_event() 调用未发送到远程桌面的主要内容,如果未能解决你的问题,请参考以下文章
JenkinsJenkins配置从节点,实现远程主机调用功能