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