每个连接都调用两次RDP连接挂钩

时间:2016-05-31 08:20:53

标签: c++ windows winapi

我希望我的应用程序挂钩远程连接并断开指定计算机上所有会话的事件。

根据文档,我应该先调用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_CONNECTWTS_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会话上为空

我不明白为什么它实际上是这样运作的。

0 个答案:

没有答案