winapi - 仅使用 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 ( ) 版本,但它并没有改变任何东西。IDNO
IDTIMEOUT
WTSSendMessageW
这是终端服务 API 中的错误吗?我在任何地方都没有找到对这种行为的任何引用。是否有解决方法(除了改写消息并使用是/否或确定/取消按钮对)?
解决方案
推荐阅读
- python - Python - 移动和压缩文件和文件夹
- flutter - 如何在flutter项目中使用jar文件
- java - 如何在没有像 Quartz Clustering 这样的集中式解决方案的情况下在分布式环境中实现 cron 作业/计划作业?
- javascript - 如何在获取请求中发送表单数据
- google-cloud-platform - 如何在本地测试 Google Cloud Storage Triggers Cloud Function?
- javascript - 替换字符串的一个字符
- minikube - Minikube pod 卡在等待中:ImagePullBackOff
- docker - Dockerize 示例 dotnet core exe 应用程序到 linux pod 中的 kubernetes
- shell - 如何使用 grep 实用程序处理连续流输出?
- php - PHP / MySql:如果字段为 NULL 或 0,则显示图像 A,如果字段为 1,则显示图像 B