首先,我想说我多年来一直使用StackOverflow,这是我第一次找不到现有答案。这是一个有价值的资源的证明。
背景: 我试图从连接的设备捕获MIDI输入,并让它触发键盘事件到任何具有焦点的窗口。我能够在Windows控制台应用程序中使用SendInput成功完成此操作,但更愿意将其作为服务运行。我能够隐藏控制台窗口并让它工作,这是一个可以通过的解决方案,但我宁愿让它工作,而不会在它隐藏之前看到控制台一秒钟。
问题: 在进行一些关于制作Windows服务的研究之后,主要使用以下来源:
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。
答案 0 :(得分:1)
无法从Windows Services与用户进行任何交互。出于安全原因,服务隔离运行。它们在单独的会话session 0中运行。 因此,您尝试执行的操作将无法正常运行,并且是有原因的。