Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2011, 17:14   #1
-Deadly-
 
Регистрация: 11.09.2011
Сообщений: 3
По умолчанию Получение даты перевода часов.

Здравствуйте, не получается получить правильный день перевода часов на летнее/стандартное время через WinAPI. Месяц возвращается верный, а день — нет.
GetTimeZoneInformation
SetTimeZoneInfomation

Код:
        public static TimeZoneInformation GetTimeZoneInformation()
        {
            var tzi = new TimeZoneInformation();
            Kernel.GetTimeZoneInformation(ref tzi);

            // Установка параметров перевода (по докам MSDN)
            tzi.StandardDate.wHour = 3;
            tzi.StandardDate.wDayOfWeek = 4;
            tzi.StandardDate.wMonth = 10;
            tzi.StandardDate.wDay = 4;

            tzi.DaylightDate.wHour = 2;
            tzi.DaylightDate.wDayOfWeek = 0;
            tzi.DaylightDate.wMonth = 4;
            tzi.DaylightDate.wDay = 3;

            // Сохранение данных перевода.
            WinAPI.SetTimeZoneInfomation(tzi);

            var info = new TimeZoneInformation();
            Kernel.GetTimeZoneInformation(ref info);

            // Структура с данными перевода часов.
            return info;
        }

        public static void SetTimeZoneInfomation(TimeZoneInformation tzi)
        {
            // Установка привилегий.
            var tkp = new TOKEN_PRIVILEGES
            {
                PrivilegeCount = 1,
                Privileges = new LUID_AND_ATTRIBUTES[1] {
                    new LUID_AND_ATTRIBUTES { Attributes = SE_PRIVILEGE_ENABLED }
                }
            };

            var hToken = new IntPtr();
           
            Advapi.OpenProcessToken(Advapi.GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, out hToken);
            Advapi.LookupPrivilegeValue("", SE_TIME_ZONE_NAME, out tkp.Privileges[0].Luid);
            Advapi.AdjustTokenPrivileges(hToken, false, ref tkp, 0, IntPtr.Zero, IntPtr.Zero);

            // Установка даты.
            Kernel.SetTimeZoneInformation(ref tzi);

             // Сброс привилегий.
            tkp.Privileges[0].Attributes = 0;
            Advapi.AdjustTokenPrivileges(hToken, false, ref tkp, 0, IntPtr.Zero, IntPtr.Zero); 
        }


        class Kernel
        {
              [DllImport("kernel32.dll", SetLastError = true)]
              public static extern uint GetTimeZoneInformation(ref TimeZoneInformation lpTimeZoneInformation);
         

              [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
              public static extern bool SetTimeZoneInformation(ref TimeZoneInformation lpTimeZoneInformation);
        } 


    class Advapi
    {
        [DllImport("Advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool AdjustTokenPrivileges(IntPtr TokenHandle, bool DisableAllPrivileges, ref TOKEN_PRIVILEGES NewState, int BufferLength, IntPtr PreviousState, IntPtr ReturnLength);


        [DllImport("advapi32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool OpenProcessToken(IntPtr ProcessHandle, UInt32 DesiredAccess, out IntPtr TokenHandle);


        [DllImport("kernel32.dll")]
        public static extern IntPtr GetCurrentProcess();


        [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool LookupPrivilegeValue(string lpSystemName, string lpName, out LUID lpLuid);
    }
-Deadly- вне форума Ответить с цитированием
Старый 03.10.2011, 12:38   #2
Guy
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 398
По умолчанию

Может дело в часовом поясе ?
Guy вне форума Ответить с цитированием
Старый 03.10.2011, 20:33   #3
-Deadly-
 
Регистрация: 11.09.2011
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Guy Посмотреть сообщение
Может дело в часовом поясе ?
Можно по подробное?
-Deadly- вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сколько часов, минут и секунд прошло от начала суток до поворота часовой стрелки часов на f градусов (нужна блок-схема) lady.ulumba Помощь студентам 5 08.09.2011 15:08
Как сделать так чтобы не отображались даты Даты вместо Цифр в ЕКСЕЛЬ? d88n Помощь студентам 1 17.06.2011 05:16
Получение времени,даты и часового пояса Socks4/5 прокси maloy_ya Работа с сетью в Delphi 5 13.05.2011 00:07
Автоматизация заполнения даты и зависимость ячейки времени к ячейке даты. Каравай Microsoft Office Excel 14 11.03.2010 18:11
часы показывают m часов, n минут и k секунд. Каковы будут показатели часов через p часов, q минут и r сек Паскалька^^ Помощь студентам 3 11.10.2009 19:41