我正在使用Windows服务。
根据我已阅读的内容和所涵盖的教程(one example),我发现所有工作必须在该服务的OnStart
方法中完成。
据我了解(从我能找到的唯一教程中,这是完全基础的),在OnStart
方法返回后,如果您不知道该服务,服务将无法执行任何操作,在方法中配置它。
我看到在上述方法中使用计时器每隔X秒触发一次事件,但是我要寻找的是检测窗口焦点变化(当程序尝试将其窗口置于最前面时)。当我在控制台应用程序中尝试但要在服务中使用它时,this答案中的解决方案效果很好。
但是,仅在OnStart
方法中注册事件处理程序是行不通的-它不会被触发,也没有任何作用。我尝试放置一个计时器只是为了使OnStart
方法继续运行,但这也无济于事-计时器正在运行,并且每次滴答都在工作,但事件处理程序从未触发(我放置了File.AppendText
对于每个计时器滴答声以及每次处理程序触发时,但在我用作控件的文本文件中,仅附加了计时器滴答声)。
最后,我尝试运行一个Task
(通过使用Task.Run
创建一个新线程),该循环在与OnStart
不同的方法中运行了一个无限循环,但这只是使该服务继续挂起。
代码:
protected override void OnStart(string[] args)
{
File.WriteAllText("file.txt", "START");
eventLog.WriteEntry("Entered OnStart method.");
// Update the service state to "Start Pending".
ServiceStatus serviceStatus = new ServiceStatus
{
dwCurrentState = ServiceState.SERVICE_START_PENDING,
dwWaitHint = 100000
};
SetServiceStatus(this.ServiceHandle, ref serviceStatus);
eventLog.WriteEntry("Start Pending.", EventLogEntryType.Information);
// Update the service state to "Running".
serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING;
SetServiceStatus(this.ServiceHandle, ref serviceStatus);
eventLog.WriteEntry("Running.", EventLogEntryType.Information);
Task.Run(KeepBusy());
}
private static Action KeepBusy()
{
Automation.AddAutomationFocusChangedEventHandler(OnFocusChangedHandler);
while (true)
{
Thread.Sleep(1000);
}
}
简而言之-如果我正确地理解服务只能以OnStart
方法执行工作,我会对这种情况看起来多么愚蠢并且无法弄清楚如何制作“侦听器”服务感到厌恶