C#Windows服务和STA线程剪贴板

时间:2018-10-18 19:43:52

标签: c# clipboard sta

经过一些搜索,我逐渐了解到,在创建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设置内容?

1 个答案:

答案 0 :(得分:0)

我将告诉您我使用Windows服务的经验。它可以帮助您完成工作。

  1. Windows服务应用程序以 LocalSystem NetworkService LocalService 用户身份运行,并且它们不依赖于任何特定用户(正常用户)。 这些是系统用户

  2. 系统用户拥有自己的会话。会话是路径(我的文档,AppData等),用户桌面GUI,设置(任何应用程序设置和用户首选项),EnvironmentalVariables和剪贴板的集合(我不确定剪贴板,但这绝对合乎逻辑)因此,您可能想找到一种方法来获取任何已登录用户的会话(这是一种实用的方法,我已经做到了这一点,然后才称为假冒,这是关于获取登录的用户令牌和....)。

  3. 在解决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。