C++ RegisterHotKey()在服务中导致错误1459(此操作需要交互式窗口站)

C++ RegisterHotKey()在服务中导致错误1459(此操作需要交互式窗口站),c++,winapi,visual-c++,C++,Winapi,Visual C++,我已经阅读了几篇类似的文章,讨论了如何启动另一个进程并在子进程中注册热键,但我的情况略有不同 我正在构建一个执行多种功能的Windows服务,并希望将其作为一个服务保留,因为我需要在系统启动时、用户登录之前以及系统关闭之前持续运行我的代码 我也投入了大量的精力来让它的其余部分开始工作,因此必须将整个项目重新构建为一个控制台应用程序,然后找出如何在系统启动时运行该应用程序,这远不是理想的 下面是执行大部分实际工作的线程回调。我已经验证了到目前为止一切运行正常,但是在调用RegisterHotKey

我已经阅读了几篇类似的文章,讨论了如何启动另一个进程并在子进程中注册热键,但我的情况略有不同

我正在构建一个执行多种功能的Windows服务,并希望将其作为一个服务保留,因为我需要在系统启动时、用户登录之前以及系统关闭之前持续运行我的代码

我也投入了大量的精力来让它的其余部分开始工作,因此必须将整个项目重新构建为一个控制台应用程序,然后找出如何在系统启动时运行该应用程序,这远不是理想的

下面是执行大部分实际工作的线程回调。我已经验证了到目前为止一切运行正常,但是在调用
RegisterHotKey
之后,我从
GetLastError
获得了1459:

DWORD WINAPI SvcWorkerThread(LPVOID param) {
    // Register a hot key to perform an internet search of the selected text
    // in the focused application, whenever the user presses Ctrl+Alt+S.
    if (!RegisterHotKey(nullptr, 1, MOD_CONTROL | MOD_ALT | MOD_NOREPEAT, 0x53)) {
        // LogError() calls GetLastError() and FormatMessage() to get the system-defined error
        // message from the last unsuccessful API call, and logs it to a file. The parameter is
        // the name of the function that failed.
        return LogError("RegisterHotKey");
    }

    // Repeatedly poll our stop event and process any WM_HOTKEY
    // messages that are sent to this thread while its running.
    MSG msg;
    while (WaitForSingleObject(svcStopEvent, 0) != WAIT_OBJECT_0) {
        if ((PeekMessage(&msg, nullptr, WM_HOTKEY, WM_HOTKEY, PM_REMOVE)) != 0) {
            // LogMessage() is basically the same as LogError(), but
            // doesn't bother with the whole error collecting process.
            LogMessage("User action", "Pressed hot key Ctrl+Alt+S");
        }
    }

    // Service has been stopped; allow thread to exit normally.
    return ERROR_SUCCESS;
}

除了启动另一个流程之外,是否绝对没有办法避免这个错误?MTIA:-)

与交互式桌面交互的代码需要在该交互式桌面上运行。您的服务在会话0中独立运行


您必须分离出系统中的那些交互部分,并在交互过程中运行它们。您可以保留该服务来管理这些交互式进程,并使用IPC进行通信。

与交互式桌面交互的代码需要在该交互式桌面上运行。您的服务在会话0中独立运行


您必须分离出系统中的那些交互部分,并在交互过程中运行它们。您可以保留该服务来管理这些交互过程,并使用IPC进行通信。

在服务中调用该服务没有任何意义,它无法检测到任何击键。谷歌“会话0隔离”了解更多信息。谢谢@HansPassant,会的!:-)在服务中调用它没有任何意义,它无法检测任何击键。谷歌“会话0隔离”了解更多信息。谢谢@HansPassant,会的!:-)谢谢,伙计,现在听起来是个不错的解决办法。如果没有更好的办法,我会在一两天内接受你的答案:-)这不是“暂时的解决办法”,这是唯一的办法。我已经找到了另一种办法,但是它有点黑客化,并且可能非常危险……所以再次感谢您的回答:-)我无法想象您实际上正在通过您的服务与交互式会话进行交互。不;你让我意识到,从服务开始一个互动的过程是非常好的,而这个过程反过来会处理其他一切。我真的不想重写代码来适应这种设计,但实际上并没有我想象的那么难。另外,你和@HansPassant让我意识到我别无选择,因此感谢你并接受了这个答案:-)谢谢,伙计,现在听起来是个不错的解决办法。如果没有更好的办法,我会在一两天内接受你的答案:-)这不是“暂时的解决办法”,这是唯一的办法。我已经找到了另一种办法,但是它有点黑客化,并且可能非常危险……所以再次感谢您的回答:-)我无法想象您实际上正在通过您的服务与交互式会话进行交互。不;你让我意识到,从服务开始一个互动的过程是非常好的,而这个过程反过来会处理其他一切。我真的不想重写代码来适应这种设计,但实际上并没有我想象的那么难。加上你和@HansPassant让我意识到我别无选择,因此感谢你并接受了这个答案:-)