【问题标题】:C# - SendInput() from Windows Service not working but returns 1 - Win03C# - Windows 服务中的 SendInput() 不起作用但返回 1 - Win03
【发布时间】:2011-05-13 16:14:04
【问题描述】:

这是一个有点不寻常的问题。我目前正在努力实现 Office 应用程序的自动化。基本上,问题是当我通过 RDP 执行我的应用程序时,我的应用程序能够与 Office 应用程序正确交互,但是如果我将应用程序设置为从 Windows 服务生成,则无法使用 SendInput() 发送击键。操作系统为 Win03 标准。

当从 Windows 服务生成应用程序时,我可以通过 pinvoke 读取窗口标题、通过互操作实现自动化等,但即使调用返回 1,SendInput() 消息似乎也消失了。所有我在这一点上,我正在尝试向对话框发送转义键击。

我尝试将击键作为虚拟键和扫描码发送。

有什么想法或提示吗?提前致谢!

(顺便说一句:我确实意识到 MSFT 不支持/批准这种自动化。)

编辑: 以防万一其他人有这个问题,这可行:

[DllImport("user32")]

public static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);


bool returnVal = NativeWin32.PostMessage(popup, 0x0100, new IntPtr(0x1b), IntPtr.Zero);

【问题讨论】:

    标签: c# windows-services sendinput


    【解决方案1】:

    从 Windows Vista 开始,不再允许服务与桌面交互。这意味着他们将没有桌面上下文来发送键盘事件。

    【讨论】:

      【解决方案2】:

      我相信 SendInput 会将键发送到当前活动窗口(或具有焦点的窗口)。通常,Windows 服务将与不同的桌面(交互式桌面)相关联 - 因此从 Windows 服务启动的应用程序也将与后台桌面相关联 - 因此没有活动窗口(或具有焦点的窗口),这可能是 sendinout 不起作用的原因.您或许可以尝试使用SendMessagePostMessage 来模拟按键点击 - 您将需要窗口句柄。

      【讨论】:

      • 感谢您的帮助;出于某种原因,我完全忽略了没有窗口可以接收焦点的事实。 grumble 我现在正在使用 PostMessage 进行测试。
      猜你喜欢
      • 2013-03-01
      • 1970-01-01
      • 2015-06-11
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多