• Windows服务弹出MessageBox对话框


    Windows服务弹出MessageBox对话框

      自从Windows升级到Vista版本后,系统服务就不在允许弹出那些惨绝人寰的MessageBox了(至于为什么不让弹出,原理有点小复杂,我也不是很门清,只是略知一点,这里就不丢人现眼了,自行Google吧),但是无论多么奇葩,总有要从服务弹出MessageBox的需求,所以就参见了国内外相关秘籍,倒是有方法可以帮助我们弹出这个对话,下面是实现代码(内部函数的具体含义MSDN详细了解)。


    #include <windows.h>
    #include <WtsApi32.h>
    #pragma comment( lib, "WtsApi32.lib" )
    BOOL SvcMessageBox( LPSTR lpCap, LPSTR lpMsg, DWORD style, DWORD &result )
    {

    if ( NULL == lpMsg || NULL == lpCap )
      return FALSE;
    result = 0;
    DWORD sessionXId = WTSGetActiveConsoleSessionId();
    return WTSSendMessage( WTS_CURRENT_SERVER_HANDLE, sessionXId,
                  lpCap, strlen(lpCap),
                  lpMsg, strlen(lpMsg),
                  style, 0, &result, FALSE );

    }

     

      在编译该代码的时候,可能vs会提示你找不到WTSGetActiveConsoleSessionId()函数,这是因为该函数是从Windows XP版本开始支持的,所以老的版本系统上没有该函数,而你的工程中却是从老的代码上升级来得,如把_WIN32_WINNT定义为0x0500,解决办法如下:
    #define _WIN32_WINNT 0x0501
    关于这些十六进制代表具体意义,自行MSDN吧。

    注意:
      弹出对话框的是用户当前进程,所以弹出的对话框不能阻塞服务进程,服务器无法通过判断该函数的返回值来做处决定,这一点很别扭,有没有大牛遇到过该问题,请指点一二。
    同时在Windows中还见到了其他的服务,弹出了如下图所示的对话框,感觉很爽,比那MessageBox用户体验要好的多,但是不知道是怎么实现的,跪求实现方法呀。

     这个如何实现呢?

  • 相关阅读:
    JS LeetCode 1423. 可获得的最大点数简单题解
    SpringBoot 学集 (第六章) Docker
    Linux 学记 (第三章)
    Linux 学记 (第二章)
    Linux 学记 (第一章)
    SpringBoot 学集 (第五章) Web开发续
    SpringBoot 学集 (第四章)Web开发
    SpringBoot 学集 (第三章) 日志框架
    SpringBoot 学集 (第二章) 配置文件
    SpringBoot 学集 (第一章)
  • 原文地址:https://www.cnblogs.com/wanghaiyang1930/p/4434898.html
Copyright © 2020-2023  润新知