我希望我的应用程序挂钩远程连接并断开指定计算机上所有会话的事件。
根据文档,我应该先调用WTSRegisterSessionNotification
函数:
WTSRegisterSessionNotification(hWnd, NOTIFY_FOR_ALL_SESSIONS);
然后在消息处理器回调中,我应该在WM_WTSSESSION_CHANGE
消息类型:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_WTSSESSION_CHANGE:
{
// do stuff
break;
}
}
}
然而,这很奇怪。每次我连接或断开我的应用程序运行的计算机,WTS_REMOTE_CONNECT
或WTS_REMOTE_DISCONNECT
都会调用两次 - 在其中一个调用中,我可以获得用户名,而在另一个调用中,我无法访问(它只是一个空字符串)。
case WM_WTSSESSION_CHANGE:
{
const int reason = (int)wParam;
const DWORD sessionId = (DWORD)lParam;
switch (reason)
{
case WTS_REMOTE_CONNECT:
{
DWORD bytesReturned = 0;
LPSTR pData = NULL;
if (WTSQuerySessionInformationA(WTS_CURRENT_SERVER_HANDLE, sessionId, WTSUserName, &pData, &bytesReturned) == 0)
{
// Handle error
break;
}
const std::string username = pData;
WTSFreeMemory(pData);
// do other stuff
我发现了this问题,但它的答案非常奇怪:
嗯,答案似乎是这些领域相当正常 在终端服务/ RDP会话上为空
我不明白为什么它实际上是这样运作的。