首页 > 解决方案 > 仅使用 MB_OK 时 WTSSendMessage 不返回超时

问题描述

我正在编写一个简单的系统服务来根据时间表打开和关闭某些计算机的远程桌面访问。这包括通知,然后注销将在系统切换到仅限本地时连接的远程用户。

为了通知用户,我使用了这个WTSSendMessage函数,它可以在给定的会话中显示一个对话框。它还允许指定超时——这在这种情况下非常重要,因此如果在给定的超时时间内没有人确认消息,服务可以简单地强制注销。

我面临的问题是WTSSendMessage(至少在最新的 Windows 10 版本 2004 和 Windows Server 2019 版本 1809 上,我测试的两个系统上)IDTIMEOUT当对话框只有 OK 按钮时无法正确返回:

WTSSendMessage(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, SESSION_STOP_TITLE,
  strlen(SESSION_STOP_TITLE), SESSION_STOP_MSG, strlen(SESSION_STOP_MSG), 
  MB_OK | MB_ICONEXCLAMATION, SESSION_WARNING_TIMEOUT, &resp, TRUE);

在这种情况下,resp变量始终包含IDOK,与用户是否单击确定或超时无关。文档没有说明带有单个 OK 按钮的特殊情况。

如果MB_OK我不使用其他任何东西(例如,MB_YESNO),则该调用将正常工作,并且resp将包含、 或 ,IDYES具体取决于发生的情况。为了以防万一,我还尝试显式地使用该函数的 unicode ( ) 版本,但它并没有改变任何东西。IDNOIDTIMEOUTWTSSendMessageW

这是终端服务 API 中的错误吗?我在任何地方都没有找到对这种行为的任何引用。是否有解决方法(除了改写消息并使用是/否或确定/取消按钮对)?

标签: winapiterminal-services

解决方案


推荐阅读