[英]C# windows service and STA thread clipboard
经过一些搜索之后,我逐渐了解到,在创建Windows服务应用程序时,您可以实现STA线程来访问剪贴板,如下所示:
thread th = new thread(myMethod);
th.SetApartmentState(ApartmentState.STA);
th.Start();
在myMethod调用下:
Clipboard.SetText("TEST");
乍一看,这似乎不起作用。 但是,在运行了一些测试之后,我得知STA线程可以访问剪贴板,而剪贴板与Windows剪贴板是分开的。
即。 我可以在此STA剪贴板中使用SetText和GetText,但无法从Windows(Control + C,Control + X,Control + V)进行复制/粘贴。
请告知,如何从STA访问实际的Windows剪贴板,以便可以Control + V设置内容?
我将告诉您我使用Windows服务的经验。 它可以帮助您完成工作。
Windows服务应用程序以LocalSystem , NetworkService和LocalService用户身份运行,并且它们不依赖于任何特定用户(普通用户)。 这些是系统用户 。
系统用户拥有自己的会话。 会话是路径(我的文档,AppData等),用户桌面GUI,设置(任何应用程序设置和用户首选项),EnvironmentalVariables和剪贴板的集合(我不确定剪贴板,但绝对合乎逻辑)因此,您可能想找到一种方法来获取所有已登录用户的会话(这是一种实用的方法,在称为模拟之前,我已经做到了这一点,这是关于获取已登录用户的令牌和....)。
解决Windows服务问题之前,请使用以下模式在用户会话中检查它们:
3-1。将此方法添加到WindowsService1
类中:
public void OnDebug()
{
OnStart(null);
}
3-2。在Program.cs
文件中,将内容更改为类似的内容:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
#if DEBUG
var Service = new WindowsService1();
Service.OnDebug();
#else
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new WindowsService1()
};
ServiceBase.Run(ServicesToRun);
#endif
}
}
这样,您可以在用户会话中运行代码并检查可能的问题(非特定于用户的问题) 。
在检查完上述模式中的代码后,您可能会看到您的代码是否有效。 这就是您必须更改代码或用户Session的方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.