如何在服务(Service)程序中显示对话框

如何在服务(Service)程序中显示对话框

作者: ac952_z_cn

下载源代码
 
   服务程序(Service)一般是不能和用户进行交互的,所以他一般是不能显示窗口的。要和用户进行交互(如显示窗口),我们必须打开用户WinSta0和desktop,下面的这段代码就是打开上述两个,并显示一个dialog:
BOOL CServiceModule::ShowMsgDlg(void)
{
       HDESK   hdeskCurrent;
    HDESK   hdesk;
    HWINSTA hwinstaCurrent;
    HWINSTA hwinsta;

    hwinstaCurrent = GetProcessWindowStation();
    if (hwinstaCurrent == NULL){
              LogEvent(_T("get window station err"));
       return FALSE;
       }

    hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
    if (hdeskCurrent == NULL){
              LogEvent(_T("get window desktop err"));
       return FALSE;
       }

//打开winsta0
    hwinsta = OpenWindowStation("winsta0", FALSE,                          
                                  WINSTA_ACCESSCLIPBOARD   |
                                  WINSTA_ACCESSGLOBALATOMS |
                                  WINSTA_CREATEDESKTOP     |
                                  WINSTA_ENUMDESKTOPS      |
                                  WINSTA_ENUMERATE         |
                                  WINSTA_EXITWINDOWS       |
                                  WINSTA_READATTRIBUTES    |
                                  WINSTA_READSCREEN        |
                                  WINSTA_WRITEATTRIBUTES);
    if (hwinsta == NULL){
              LogEvent(_T("open window station err"));

       return FALSE;
       }

    if (!SetProcessWindowStation(hwinsta)){
              LogEvent(_T("Set window station err"));

       return FALSE;
       }

//打开desktop
    hdesk = OpenDesktop("default", 0, FALSE,                
                            DESKTOP_CREATEMENU |
                            DESKTOP_CREATEWINDOW |
                            DESKTOP_ENUMERATE    |
                            DESKTOP_HOOKCONTROL  |
                            DESKTOP_JOURNALPLAYBACK |
                            DESKTOP_JOURNALRECORD |
                            DESKTOP_READOBJECTS |
                            DESKTOP_SWITCHDESKTOP |
                            DESKTOP_WRITEOBJECTS);
       if (hdesk == NULL){
              LogEvent(_T("Open desktop err"));

           return FALSE;
       }

       SetThreadDesktop(hdesk);

//到这一步,我们获取了和用户交互(如显示窗口)的权利
       CMsgDlg dlgMsg;
//显示一个dialog
       dlgMsg.DoModal();              

       if (!SetProcessWindowStation(hwinstaCurrent))
           return FALSE;

       if (!SetThreadDesktop(hdeskCurrent))
      return FALSE;

       if (!CloseWindowStation(hwinsta))
              return FALSE;

       if (!CloseDesktop(hdesk))
           return FALSE;

              return TRUE;
}
 
运行:编译生成guiser.exe, 运行guiser /service, 然后在控制面板的服务中启动该服务,将会出现一个对话框!

上述程序在win2000 professional + VC6.0 + Sp5.0 + Platform SDK 2001.8编译运行通过
如有编译不通过,请下载最新的Platform SDK
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值