смена обоев в Windows 7

#c# #.net #windows-7

#c# #.net #windows-7

Вопрос:

У меня проблема со сменой обоев с помощью кода, у меня есть приведенный ниже код, поскольку в каждом потоке SO / Codeproject говорится о смене обоев. (Пока не тестировался на других ОС Win)

     const int SPI_SETDESKWALLPAPER = 20;
    const int SPIF_UPDATEINIFILE = 0x01;
    const int SPIF_SENDWININICHANGE = 0x02;

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern int SystemParametersInfo(
        int uAction, int uParam, string lpvParam, int fuWinIni); 

    SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, @"C:Temp100_5715.JPG.bmp",
            SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
 

Реальная проблема, с которой я столкнулся здесь, заключается в том, что если я создам приведенный выше код как службу Windows и установлю его как «Локальную службу» или «Локальную систему», он вообще не будет работать. Но если я создам приведенный выше код в качестве консольного приложения, тогда все заработает.

Интересно, в чем проблема? Да, моя учетная запись пользователя имеет права администратора. Также у меня здесь Windows 7 Ultimate.

Спасибо 🙂

Ответ №1:

Службы выполняются в своем собственном сеансе, который называется сеансом 0 начиная с Vista. Он изолирован от сеанса пользователя по соображениям безопасности, службы запускаются с очень привилегированной учетной записью. Вы меняете рабочий стол этого невидимого сеанса.

Вы не можете использовать службу.

Комментарии:

1. Создание службы в качестве пользовательского типа вместо локальной системы или локальной службы решит проблему? Хотя я пытался это сделать, но каждый раз, когда я пытаюсь его установить, он запрашивает имя пользователя и пароль. Хотя я пытаюсь предоставить свои учетные данные для входа в систему, это не потребуется. Не знаю, что делать.

2. Это не имеет ничего общего с учетной записью пользователя, сеанс изолирован. Опять же, вы не можете использовать службу. Google «изоляция сеанса 0» для получения справочной информации. Вам также не нужна служба, нет смысла менять растровые изображения рабочего стола, когда никто не вошел в систему. Поместите ярлык вашей программы в папку автозагрузки пользователя.