从 RDP 会话上运行的应用程序检测快速用户切换事件(RDP 窗口最小化)

Ram*_*san 5 rdp remote-desktop gdi screen-capture visual-c++

我正在开发一个记录屏幕的应用程序,它应该支持终端服务,问题实际上是当 RDP 窗口最小化时,用户会话进入无 UI 模式,并且在该应用程序上运行的应用程序无法捕获屏幕特定会议。

\n\n

有一种方法可以通过设置注册表值来保留 UI 来处理此问题,如此处所述

\n\n

但我不想这样做,并且想捕获 UI less 模式状态并向用户显示一条消息,表明 RDP 窗口已最小化/已发生快速用户切换并且录制已暂停。

\n\n

因此,我决定枚举活动会话并检查用户会话是否空闲或 UI less。但这没有帮助。在几乎花了一天时间后,我没有找到任何关于在 RDP 窗口最小化时检测快速用户切换的线索。

\n\n

我找不到任何可以调用的事件或 API,以确保屏幕捕获因快速用户切换/最小化 RDP 窗口而失败。

\n\n

这是我的代码,

\n\n
bool bActive = false;\n\n{\n    DWORD dwCurrentProcessSessionID = 0;\n\n    ProcessIdToSessionId(GetCurrentProcessId(), &dwCurrentProcessSessionID);\n\n    PWTS_SESSION_INFO pSessionInfo = 0;\n    DWORD dwCount = 0;\n\n    // Get the list of all terminal sessions    \n    WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSessionInfo, &dwCount);\n\n    int dataSize = sizeof(WTS_SESSION_INFO);\n\n    // look over obtained list in search of the active session\n    for (DWORD i = 0; i < dwCount; ++i)\n    {\n        WTS_SESSION_INFO si = pSessionInfo[i];\n        if (_WTS_CONNECTSTATE_CLASS::WTSActive == si.State)\n        {\n            // If the current session is active \xe2\x80\x93 store its ID\n            if (dwCurrentProcessSessionID == si.SessionId)\n            {\n                // would like to have an API that can identify whether the current RDP session is UI less\n                if (FunctionToFindCurrentRDPIsUIless(si.SessionId))\n                {\n                    bActive = false;\n                }\n                else\n                {\n                    bActive = true;\n                }\n\n                break;\n            }\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

任何帮助,将不胜感激。

\n