在Windows服务中可以使用C ++ SendInput吗?

时间:2015-09-09 08:47:29

标签: c++ windows-services sendinput

首先,我想说我多年来一直使用StackOverflow,这是我第一次找不到现有答案。这是一个有价值的资源的证明。

背景: 我试图从连接的设备捕获MIDI输入,并让它触发键盘事件到任何具有焦点的窗口。我能够在Windows控制台应用程序中使用SendInput成功完成此操作,但更愿意将其作为服务运行。我能够隐藏控制台窗口并让它工作,这是一个可以通过的解决方案,但我宁愿让它工作,而不会在它隐藏之前看到控制台一秒钟。

问题: 在进行一些关于制作Windows服务的研究之后,主要使用以下来源:

MSDN Windows Service Tutorial

CodeProject Windows Service Tutorial

我的印象是可能存在安全限制,导致SendInput无法在Windows服务中工作(这是可以理解的)。我决定先尝试一个概念验证,然后再走得太远,看看能否让它发挥作用。我从MSDN运行示例代码,并能够按照教程中的描述安装和工作。在这样做之后,我将以下代码添加到SampleService.cpp类中的示例中:

    while (!m_fStopping)
{
    // Perform main service function here...
    INPUT keyEvents;
    keyEvents.type = INPUT_KEYBOARD;
    keyEvents.ki.wScan = 0;
    keyEvents.ki.time = 0;
    keyEvents.ki.dwExtraInfo = 0;

    keyEvents.ki.wVk = 0x41;
    keyEvents.ki.dwFlags = 0;
    SendInput(1, &keyEvents, sizeof(INPUT));
    ::Sleep(5000);  // Simulate some lengthy operations.
}

我没有更改任何其他代码。安装服务后,我发现它在服务中列出,在启动之前,我进入了“属性”,“登录”选项卡,并将“登录”设置为“本地系统帐户”并选中“允许服务与桌面交互”。在运行服务时,我不会在任何接受文本的窗口中看到小写字母。

是否可以在服务中使用SendInput?如果是这样,怎么样?如果没有,是否有另一种方法让服务将密钥事件发送到任何活动窗口?

我使用的是Windows 8 64位,IDE是VS2012 Professional。

1 个答案:

答案 0 :(得分:1)

无法从Windows Services与用户进行任何交互。出于安全原因,服务隔离运行。它们在单独的会话session 0中运行。 因此,您尝试执行的操作将无法正常运行,并且是有原因的。