百度空间 | 百度首页 
 
查看文章
 
Windows Service下的MessageBox
2009年09月12日 星期六 14:32

因为项目的原因今天又搞起了Windows service,由于项目的需求要在windows下show一个messageBox出来.我记得以前曾经搞过,拍胸脯说Ok,这个好办.

我记得windows service call一下win32的MessageBox就搞定了吧

int MessageBox(      
    HWND hWnd,     LPCTSTR lpText,     LPCTSTR lpCaption,     UINT uType );

DllImport一下,咦,没有反应.囧

查了一下才知道,这个方式在visit之后就不好使了.我们可以通过WTTSendMessage来发送消息.

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
);

安装国际惯例我们包一层供别人更好的使用

1public class MessageBox
2
{
3    private static IntPtr WTS_CURRENT_SERVER_HANDLE =
IntPtr.Zero;
4    private static int WTS_CURRENT_SESSION =
WTSGetActiveConsoleSessionId();
5    public MessageBoxResult Show(string title, string
text, MessageBoxButtons messageBoxButtons)
6    
{
7         var style = (int
)messageBoxButtons;
8        int resp = 0
;
9

10         var result =
WTSSendMessage(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, title, title.Length, text,
11                                     text.Length, style, 0, out resp, true
);
12        int error =
Marshal.GetLastWin32Error();
13
         Marshal.ThrowExceptionForHR(error);
14        return
(MessageBoxResult)resp;
15     }

16

17     [DllImport("kernel32.dll"
)]
18    static extern int
WTSGetActiveConsoleSessionId();
19

20     [DllImport("wtsapi32.dll", SetLastError = true
)]
21    static extern bool
WTSSendMessage(
22
                 IntPtr hServer,
23                 [MarshalAs(UnmanagedType.I4)] int
SessionId,
24
                 String pTitle,
25                 [MarshalAs(UnmanagedType.U4)] int
TitleLength,
26
                 String pMessage,
27                 [MarshalAs(UnmanagedType.U4)] int
MessageLength,
28                 [MarshalAs(UnmanagedType.U4)] int
Style,
29                 [MarshalAs(UnmanagedType.U4)] int
Timeout,
30                 [MarshalAs(UnmanagedType.U4)] out int
pResponse,
31                bool
bWait);
32

33}

34

35public enum
MessageBoxResult
36
{
37
     None,
38
     OK,
39
     Cancel,
40
     Abort,
41
     Retry,
42
     Ignore,
43
     Yes,
44
     No
45}

46

47public enum
MessageBoxButtons
48
{
49
     OK,
50
     OKCancel,
51
     AbortRetryIgnore,
52
     YesNoCancel,
53
     YesNo,
54
     RetryCancel
55}

56
57

使用方法和普通的messagebox没有多少区别,Show方法可以根据自己的喜好重载一下咯,我就不糊代码了!

参考:

http://blogs.msdn.com/yvesdolc/archive/2009/08/20/do-you-still-use-the-messagebox-api-in-your-windows-service.aspx

http://msdn.microsoft.com/en-us/library/aa383842(VS.85).aspx

http://www.pinvoke.net/default.aspx/wtsapi32/WTSSendMessage.html


类别:windows 开发 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu