C# C windows服务在安装后不返回剪贴板数据

C# C windows服务在安装后不返回剪贴板数据,c#,windows,windows-services,clipboard,C#,Windows,Windows Services,Clipboard,我有一个windows服务程序的代码,它应该时不时地清除剪贴板。在控制台应用程序中测试它证明它是一个工作代码,然后通过Topshelf nuget包将控制台应用程序转换为服务。但是,将其作为一项服务运行,它根本无法完成任务。在一些基本的日志记录之后,我发现剪贴板.Hastext和所有其他文件在安装了直接从调试文件夹安装的服务后返回false。我遗漏了什么,或者应该考虑的调试模式和部署模式之间的区别是什么 public class Service { readonl

我有一个windows服务程序的代码,它应该时不时地清除剪贴板。在控制台应用程序中测试它证明它是一个工作代码,然后通过Topshelf nuget包将控制台应用程序转换为服务。但是,将其作为一项服务运行,它根本无法完成任务。在一些基本的日志记录之后,我发现剪贴板.Hastext和所有其他文件在安装了直接从调试文件夹安装的服务后返回false。我遗漏了什么,或者应该考虑的调试模式和部署模式之间的区别是什么

    public class Service
    {
        readonly Timer timer;
        object clipboardData;

        public Service()
        {
            timer = new Timer(TimeSpan.FromMinutes(1).TotalMilliseconds)
            {
                AutoReset = true
            };
            timer.Elapsed += Timer_Elapsed;
        }

        /// <summary>
        /// Checks every minute if there is any data on the clipboard.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            CurrentThreadParse(DoWork);
        }

        public void Start()
        {
            timer.Start();
        }

        public void Stop()
        {
            timer.Stop();
        }

        private void ChangeClipboardData()
        {
            if (Clipboard.ContainsText())
            {
                clipboardData = Clipboard.GetText();
                WriteChanged();
            }
            else if (Clipboard.ContainsImage())
            {
                clipboardData = Clipboard.GetImage();
                WriteChanged();
            }
            else if (Clipboard.ContainsAudio())
            {
                clipboardData = Clipboard.GetAudioStream();
                WriteChanged();
            }
            else if (Clipboard.ContainsFileDropList())
            {
                clipboardData = Clipboard.GetFileDropList();
                WriteChanged();
            }
#if DEBUG
            else
                Console.WriteLine("No change!");
#endif
        }

        private void WriteChanged()
        {
#if DEBUG
            Console.WriteLine("Clipboard data has changed!");
#endif
        }

        private object GetClipboardObject()
        {
            if (Clipboard.ContainsText())
                return Clipboard.GetText();
            else if (Clipboard.ContainsImage())
                return Clipboard.GetImage();
            else if (Clipboard.ContainsAudio())
                return Clipboard.GetAudioStream();
            else if (Clipboard.ContainsFileDropList())
                return Clipboard.GetFileDropList();
            return null;
        }

        private void ClearClipboard()
        {
            Clipboard.Clear();
            clipboardData = null;
#if DEBUG
            Console.WriteLine("Clipboard data removed!");
#endif
        }

        /// <summary>
        /// Sets the current thread as STA.
        /// </summary>
        /// <param name="threadStart">The code to run.</param>
        private void CurrentThreadParse(ThreadStart threadStart)
        {
            Thread thread = new Thread(threadStart);
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
            thread.Join();
        }

        private void DoWork()
        {
            object clipboardObject = GetClipboardObject();
            if (clipboardData == null)
            {
                ChangeClipboardData();
            }
            else if (clipboardData.Equals(clipboardObject))
            {
                ClearClipboard();
            }
            else
            {
                //The last check returned data from the clipboard, but was changed,
                //so the clipboard should not be cleared.
                ChangeClipboardData();
            }
        }
    }

完整的项目可以在这里找到:

使用服务是不可能的

服务正在Windows会话0上的单独会话中运行。用户处于不同的会话中—始终为会话1、2等。服务无法从其他会话访问用户的剪贴板

相反,您可以创建要在用户会话中执行的Windows计划任务,该任务仅在用户登录任务时运行。时间表可能有任何重复间隔