繁体   English   中英

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

[英]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服务的经验。 它可以帮助您完成工作。

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

  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的方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM