如何制作防止焦点窃取的Windows服务?

时间:2018-08-29 10:12:36

标签: c# service listener

我正在使用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方法执行工作,我会对这种情况看起来多么愚蠢并且无法弄清楚如何制作“侦听器”服务感到厌恶

0 个答案:

没有答案