win7 下服务程序弹出对话框 win7 session 隔离

本文介绍在Windows 7与Vista系统中,服务程序如何通过WTSSendMessage函数实现与用户的对话框交互,并提供获取当前活动控制台会话ID的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于win7与vista下session隔离的文章网上已经有很多文章,大家可以自己google。

这里主要讲win7与vista下服务程序如何弹出对话框。

这个问题也是我自己遇到过,需要服务程序与用户进行简单的交互比如说弹出个对话框。

但是在win7与vista下直接使用messagebox将会出现一个交互式对话框提示用户是否查看消息,如果用户点击否则服务程序就阻塞在那里了。

于是到网上找了会办法其实很简单,就是使用WTSSendMessage函数。对于这个函数的使用网上有多资料。

BOOL WTSSendMessage(
  __in          HANDLE hServer,
  __in          DWORD SessionId,
  __in          LPTSTR pTitle,
  __in          DWORD TitleLength,
  __in          LPTSTR pMessage,
  __in          DWORD MessageLength,
  __in          DWORD Style,
  __in          DWORD Timeout,
  __out         DWORD* pResponse,
  __in          BOOL bWait
);

我在使用这函数时始终没有看到对话框的弹出。

最后发现是第二个参数SessionId:需要是当前活动的控制台session的id。

网上说windows提供一个专门的方法来获得该sessionid即WTSGetActiveConsoleSessionId。

但是在使用该方法链接阶段总是报错说找不到该符号。

于是自己写了函数来获得该sessionid。

DWORD GetActiveConsoleSessionId()
{
  PWTS_SESSION_INFO ppSessionInfo;
  DWORD  pCount;
  BOOL flag;
  DWORD  sessionid = -1;
  flag = WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE,
                 0,
                 1,
                 &ppSessionInfo,
                 &pCount);
 if(!flag)
 {
  return -1;
 }
 while(pCount > 0)
 {
  --pCount;
  if((ppSessionInfo[pCount].State == WTSActive )&&(ppSessionInfo[pCount].pWinStationName  == "console"))//这里的字符串比较方法自己去找我这里意思一下
  {
   sessionid = ppSessionInfo[pCount].SessionId;
   break;
  }
 }   
 WTSFreeMemory(ppSessionInfo);
 return sessionid;         
}
字符串比较方法请自己修改

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值