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