![](/img/trans.png)
[英]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.