在Windows 7中使用.NET Windows服务显示消息框

在Windows 7中使用.NET Windows服务显示消息框,.net,windows-services,.net,Windows Services,在Windows 7中使用.NET Windows服务显示消息框 我们有一个windows服务,当用户在windows xp上扫描他们的访问卡时,它会显示一个确认消息框,但一旦我们迁移到windows 7,弹出功能就不再起作用了。如本文所述,我遵循了说明,当我以控制台应用程序的形式运行应用程序时,它可以工作,但当我以windows服务的形式安装应用程序时,它就不工作了。下面是我的代码。另外,结果变量返回false,err变量返回5 class Class1 { public static

在Windows 7中使用.NET Windows服务显示消息框

我们有一个windows服务,当用户在windows xp上扫描他们的访问卡时,它会显示一个确认消息框,但一旦我们迁移到windows 7,弹出功能就不再起作用了。如本文所述,我遵循了说明,当我以控制台应用程序的形式运行应用程序时,它可以工作,但当我以windows服务的形式安装应用程序时,它就不工作了。下面是我的代码。另外,结果变量返回false,err变量返回5

class Class1
{
    public static IntPtr WTS_CURRENT_SERVER_HANDLE = IntPtr.Zero;
    public static int WTS_CURRENT_SESSION = -1;
    public void test()
    {
        bool result = false;
        string title = "Hello";
        int tlen = title.Length;
        string msg = "Terminal Service!";
        int mlen = msg.Length;
        int resp = 0;

        result = WTSSendMessage(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, title, tlen, msg, mlen, 0, 0, out resp, true);
        int err = Marshal.GetLastWin32Error();
        System.Console.WriteLine("result:{0}, errorCode:{1}, response:{2}", result, err, resp);

    }

    [DllImport("wtsapi32.dll", SetLastError = true)]
    static extern bool WTSSendMessage(
        IntPtr hServer,
        [MarshalAs(UnmanagedType.I4)] int SessionId,
        String pTitle,
        [MarshalAs(UnmanagedType.U4)] int TitleLength,
        String pMessage,
        [MarshalAs(UnmanagedType.U4)] int MessageLength,
        [MarshalAs(UnmanagedType.U4)] int Style,
        [MarshalAs(UnmanagedType.U4)] int Timeout,
        [MarshalAs(UnmanagedType.U4)] out int pResponse,
        bool bWait);

    [DllImport("Kernel32.dll", SetLastError = true)]
    static extern int WTSGetActiveConsoleSessionID();

}
对WTSSendMessage()的调用指定WTS_当前会话,这意味着“显示当前会话上的消息框”。当您作为服务运行时,您处于会话0上,即。你肯定不希望你的信息框出现在那里


要在常规用户的会话中显示,您必须提供非零会话ID。有关详细信息,请参阅。

您已声明了WTSGetActiveConsoleSessionId,但从未调用过它。该函数返回当前活动的会话ID。这是您必须传递给WTSSendMessage的会话ID

您当前的代码正试图在服务会话0中显示消息。不是你想要的

在调用函数之前,必须更正其声明。你拼错了。它名为WTSGetActiveConsoleSessionId

我认为字符串长度参数需要考虑零终止符。向传递的值添加1。如果切换到Unicode API,则必须将这些值乘以2,因为它们是以字节而不是字符度量的


还有一点。仅当API调用失败时才请求错误代码。因此,在代码中,如果结果为false,则只能调用Marshal.GetLastWin32Error。

我尝试使用WTSGetActiveConsoleSessionID(),但由于某种原因,它会使windows服务崩溃。我做错什么了吗?