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

原文:http://www.vckbase.com/index.php/wv/94

服务程序(Service)一般是不能和用户进行交互的,所以他一般是不能显示窗口的。要和用户进行交互(如显示窗口),我们必须打开用户WinSta0和desktop,下面的这段代码就是打开上述两个,并显示一个dialog:

01. BOOL CServiceModule::ShowMsgDlg(void)
02. {
03. HDESK   hdeskCurrent;
04. HDESK   hdesk;
05. HWINSTA hwinstaCurrent;
06. HWINSTA hwinsta;
07.  
08. hwinstaCurrent = GetProcessWindowStation();
09. if (hwinstaCurrent == NULL){
10. LogEvent(_T("get window station err"));
11. return FALSE;
12. }
13.  
14. hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
15. if (hdeskCurrent == NULL){
16. LogEvent(_T("get window desktop err"));
17. return FALSE;
18. }
19.  
20. //打开winsta0
21. hwinsta = OpenWindowStation("winsta0", FALSE,                         
22. WINSTA_ACCESSCLIPBOARD   |
23. WINSTA_ACCESSGLOBALATOMS |
24. WINSTA_CREATEDESKTOP     |
25. WINSTA_ENUMDESKTOPS      |
26. WINSTA_ENUMERATE         |
27. WINSTA_EXITWINDOWS       |
28. WINSTA_READATTRIBUTES    |
29. WINSTA_READSCREEN        |
30. WINSTA_WRITEATTRIBUTES);
31. if (hwinsta == NULL){
32. LogEvent(_T("open window station err"));
33.  
34. return FALSE;
35. }
36.  
37. if (!SetProcessWindowStation(hwinsta)){
38. LogEvent(_T("Set window station err"));
39.  
40. return FALSE;
41. }
42.  
43. //打开desktop
44. hdesk = OpenDesktop("default", 0, FALSE,               
45. DESKTOP_CREATEMENU |
46. DESKTOP_CREATEWINDOW |
47. DESKTOP_ENUMERATE    |
48. DESKTOP_HOOKCONTROL  |
49. DESKTOP_JOURNALPLAYBACK |
50. DESKTOP_JOURNALRECORD |
51. DESKTOP_READOBJECTS |
52. DESKTOP_SWITCHDESKTOP |
53. DESKTOP_WRITEOBJECTS);
54. if (hdesk == NULL){
55. LogEvent(_T("Open desktop err"));
56.  
57. return FALSE;
58. }
59.  
60. SetThreadDesktop(hdesk);
61.  
62. //到这一步,我们获取了和用户交互(如显示窗口)的权利
63. CMsgDlg dlgMsg;
64. //显示一个dialog
65. dlgMsg.DoModal();             
66.  
67. if (!SetProcessWindowStation(hwinstaCurrent))
68. return FALSE;
69.  
70. if (!SetThreadDesktop(hdeskCurrent))
71. return FALSE;
72.  
73. if (!CloseWindowStation(hwinsta))
74. return FALSE;
75.  
76. if (!CloseDesktop(hdesk))
77. return FALSE;
78.  
79. return TRUE;
80. }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值