Служба Windows C # и буфер обмена STA - PullRequest
0 голосов
/ 18 октября 2018

После некоторых поисков я понял, что при создании приложения-службы Windows вы можете реализовать потоки STA для доступа к буферу обмена следующим образом:

thread th  = new thread(myMethod);
th.SetApartmentState(ApartmentState.STA);
th.Start();

Под вызовом myMethod:

Clipboard.SetText("TEST");

На первый взгляд кажется, что это не работает.Однако после прохождения некоторых тестов я с тех пор узнал, что потоки STA могут обращаться к буферу обмена, который отделен от буфера обмена Windows.

т.е.Я могу установить SetText и GetText в этом буфере обмена STA, но я не могу выполнить копирование / вставку из окон (Control + C, Control + X, Control + V).

Посоветуйте, пожалуйста, как получить доступ кфактический буфер обмена Windows от STA, чтобы я мог Control + V установить содержимое?

1 Ответ

0 голосов
/ 19 октября 2018

Я расскажу вам мой опыт работы с Windows Services.Это может помочь вам сделать вашу работу.

  1. Приложения службы Windows запускаются как LocalSystem , NetworkService и LocalService Пользователи, и они не зависят от каких-либо конкретныхпользователь (обычные пользователи). Это системные пользователи .

  2. У пользователей системы есть собственный сеанс.Сессия - это коллекция путей (Мои документы, AppData, ...), GUI рабочего стола пользователя, Настройки (Настройки любого приложения и пользовательские настройки), Переменные среды и Буфер обмена (Я не уверен насчет буфера обменано это абсолютно логично) Так что вы можете найти способ получить сеанс для любого вошедшего в систему пользователя (это практичный способ, и я сделал это до того, как он называется Олицетворение и речь идет о получении зарегистрированногов токене пользователя и ....).

  3. Прежде чем решать проблемы службы Windows, проверьте их в сеансе пользователя, используя этот шаблон:

3-1. Добавьте этот метод в WindowsService1 class:

 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
    }
}

Таким образом, вы можете запустить свой код в сеансе пользователя.и проверьте возможные проблемы (не связанные с пользователем проблемы) .

После проверки ваших кодов по приведенному выше шаблону вы можете увидеть, что ваш код работает или нет.и так вы обнаружите, что должны изменить свои коды или сеанс пользователя.

...