[英]Query with wtsapi32.dll doesn`t work with SAM-Account-Name for japanese users
[英]how to use WtsApi32.dll in lock/Unlock session handler in windows service?
我想使用Windows服务检测并关闭任何程序(例如:Notepad.exe)。 下面的代码是在控制台应用程序中的不错选择。
class Program
{
private static SessionSwitchEventHandler sseh;
static void Main(string[] args)
{
sseh = new SessionSwitchEventHandler(SystemEvents_SessionSwitch);
SystemEvents.SessionSwitch += sseh;
while (true) { }
}
static void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
{
Console.WriteLine(e.Reason.ToString());
}
}
但以上代码在Windows Service Windows 7中不起作用。请看此链接:
http://social.msdn.microsoft.com/Forums/eu/netfxcompact/thread/04b16fac-043a-41c3-add9-482c912e95be
我已经在无法在win 7上运行的Windows服务中编写了以下代码,每次在控制台应用程序中的Windows 7上都可以正常工作。
protected override void OnStart(string[] args)
{
SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
Console.ReadLine();
SystemEvents.SessionSwitch -= SystemEvents_SessionSwitch;
}
static void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
{
WriteToLogFile( e.Reason.ToString());
if (e.Reason == SessionSwitchReason.SessionLock)
{
WriteToLogFile("SessionLock ");
}
if (e.Reason == SessionSwitchReason.SessionUnlock)
{
WriteToLogFile("SessionUnlock ");
}
if (e.Reason == SessionSwitchReason.SessionLogon)
{
WriteToLogFile("SessionLogon ");
}
}
我已经阅读了这篇文章( http://rhauert.wordpress.com/category/ucc/ ),但是我不能使用
protected override void OnStart(string[] args)
{
WriteToText("Windows Service is started");
SessionChangeHandler x = new SessionChangeHandler();
}
MSDN:
SystemEvents.SessionSwitch事件 :
仅在消息泵正在运行时才引发此事件。 在Windows服务中,除非使用隐藏表单或手动启动消息泵,否则不会引发此事件。 有关显示如何通过使用Windows服务中的隐藏表单处理系统事件的代码示例,请参见SystemEvents类。
此页面上的代码示例,还指出:
服务没有消息循环,除非允许它们与桌面交互。 如果此隐藏示例未提供消息循环,则该服务必须在本地系统帐户下运行,并且需要手动干预才能与桌面进行交互。 即,管理员必须手动选中服务属性对话框的“登录”选项卡上的“允许服务与桌面交互”复选框。 在这种情况下,将自动提供消息循环。 仅当服务在本地系统帐户下运行时,此选项才可用。 无法通过编程方式启用与桌面的交互。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.