C# 如何使windows服务防止焦点窃取?

C# 如何使windows服务防止焦点窃取?,c#,service,listener,C#,Service,Listener,我正在尝试Windows服务 从我所阅读的内容和所涵盖的教程()中,我发现所有的工作都必须在服务的OnStart方法中完成。 据我所知(从我能找到的唯一教程来看,它们是完全基本的),在OnStart方法返回后,如果您没有以某种方式在该方法中配置服务,该服务将无法执行任何操作。 我看到在上述方法中使用定时器每X秒触发一次事件,但我要寻找的是检测窗口焦点的变化(当程序试图将其窗口置于前端时)。当我在控制台应用程序中尝试时,answer中的解决方案非常有效,但我希望在我的服务中使用它 但是,仅在OnS

我正在尝试Windows服务

从我所阅读的内容和所涵盖的教程()中,我发现所有的工作都必须在服务的
OnStart
方法中完成。
据我所知(从我能找到的唯一教程来看,它们是完全基本的),在
OnStart
方法返回后,如果您没有以某种方式在该方法中配置服务,该服务将无法执行任何操作。
我看到在上述方法中使用定时器每X秒触发一次事件,但我要寻找的是检测窗口焦点的变化(当程序试图将其窗口置于前端时)。当我在控制台应用程序中尝试时,answer中的解决方案非常有效,但我希望在我的服务中使用它

但是,仅在
OnStart
方法中注册eventhandler是不起作用的-它不会被触发,也没有任何效果。我试着设置一个计时器,只是为了让
OnStart
方法继续运行,但这也没用——计时器正在运行,而且每次都在工作,但eventhandler从未启动(我为每个计时器勾号和每次处理程序启动都添加了一个
文件.AppendText
,但在我用作控件的文本文件中,只添加了计时器勾号)。
最后,我尝试运行一个
任务
(通过使用
Task.Run
创建一个新线程),它以一种与
OnStart
不同的方法运行一个无休止的循环,但这只会使服务在继续运行时挂起

代码:


简言之,如果我正确理解了服务只能在
OnStart
方法中执行工作,那么我对这看起来有多么愚蠢感到厌恶,也不知道如何做一个“监听器”服务

OnStart
方法中,您可以创建一个后台线程,执行必要的工作,可能是循环。这是一种广泛使用的方法。交互式服务可能很危险,请参阅:@KBO,谢谢!我以为我是通过使用
任务来完成的。运行
?让我稍微编辑一下问题……实际上,您应该这样做在OnStart中尽可能少。它应该尽可能快地返回。大多数情况下,你只想启动一些后台线程,也许做一些配置,就这样。其他一切都应该在该后台线程上处理。没有代码,就不可能提供关于如何修复代码的有用帮助。因此,这将非常棒如果您可以提供一个在独立会话中运行的服务(使用自己的桌面),则从根本上说,该服务不应该与其他用户(即您的用户)交互桌面。听起来你正在做的任何事情都更适合于每个用户的自动运行应用程序。@Fildor,我知道,对不起,我只是想,因为这更像是一个主要问题,而且我没有任何可用代码,所以最好不要它。我明天会尝试添加它。
    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);
        }
    }