经过一些搜索,我逐渐了解到,在创建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设置内容?
答案 0 :(得分:0)
我将告诉您我使用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。