На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ElcnU
  
> зафиксировать изменение системного времени , WM5.0
    Всем привет!
    Основная задача такая: зафиксировать изменение системного времени (с какого на какое).
    1. В настройках есть ярлык, который запускает cloc.exe. Как мне по клику на этот ярлык запустить свою прогу? К примеру, удалить ярлык на clock.exe и добавить ярлык на свою прогу.
    2. Есть Notification типа NOTIFICATION_EVENT_TIME_CHANGE. Я могу подписаться на это событие, но не понял, как мне получить время с которого и на какое были произведены изменения. Если это возможно, то это идеальный вариант.
    Заранее всем благодарен!
      В реестре нашел такую ветку для подсветки:
      HKLM\ControlPanel\Backlight\

      Там два параметра:
      Group - на какой закладке настроек отображать (0 - 2)
      Redirect - судя по всему, что запускать (там указано имя файла)

      Для часов ничего подобного там нет.
      Предполагаю, что надо просто добавить, но не знаю как должно называться :(

      Если кто знает - подскажите, плиз
        Цитата -=CAP=- @
        Основная задача такая: зафиксировать изменение системного времени (с какого на какое).

        если я правильно тебя понял, то надо отловить ручное изменение времени?
        тогда запускаем фоновое приложение, которое делает следующее
        while ()
        {
        GetSystemTime(Time1);
        Sleep(1000);
        GetSystemTime(Time2);
        // если разница между Time1 и Time2 намного больше значения Sleep, то время явно поменялось вручную...
        }
          kvv@home, а как будет работать этот метод после "пробуждения"?
            Fester, это не метод :)
            так тоже возможно, но очень уж не стабильно
              Цитата Fester @
              а как будет работать этот метод после "пробуждения"?

              будет лажать, разумеется. =) правда попробовать запускать проверяющее приложение по событию Wake_up ( CeRunAppAtEvent(...,NOTIFICATION_EVENT_WAKEUP), и тогда эту ситуацию можно будет разрулить)

              или вот еще предложение.
              один процесс сидит в памяти постоянно (запускаем либо по wake_up либо в автостарте) и периодически сохраняет куда-нибудь текущее время (в файл, в реестр, в бд, в shared area, в memory mapped file - в данном случае не важно)
              проверяющее приложение запускается по изменению системного времени CeRunAppAtEvent(...,NOTIFICATION_EVENT_TIME_CHANGE), и имеет сохраненное время - то, с которого поменяли, текущее время - то, на которое поменяли.
                А вот еще другое предложение.

                Почему бы не сделать приложение полноэкранным? :) И тем самым запретить пользователю выходить/переключаться из программы и менять систему. (ну придется конечно soft keys переопредилить :) )
                  Все гараздо прощще, kvv@home, но есть некоторые нюансы :)

                  В реестре создаем ветку HKLM\ControlPanel\Clock
                  Туда добавляем ключ Group со значением 0, 1 или 2 (номер закладки в настройках, на которой надо отображать ярлык)

                  А дальше одно из двух:

                  1. Добавляем ключ Redirect со значением - путь к файлу
                  По идее должен запускаться этот файл вместо Clock.exe, но не отрабатывает.

                  2. Добавляем ключ Hide со значением 0 или 1 (скрыть или отобразитя ярлак, соответственно)
                  А потом в ControlPanel добавляем свою иконку (такую же :) )
                  Но загвоздка в том, что я не знаю, как в ControlPanel добавить свою прогу :(

                  На данном этапе вот такой тупичок :)

                  Добавлено
                  Цитата Fester @
                  Почему бы не сделать приложение полноэкранным?

                  Fester, эта идея у меня возникла в первую очередь :)
                  Но так нельзя :(
                    Цитата -=CAP=- @
                    Но загвоздка в том, что я не знаю, как в ControlPanel добавить свою прогу

                    http://www.pocketpcdn.com/articles/controlpanelapplet.html
                      Цитата kvv@home @
                      http://www.pocketpcdn.com/articles/controlpanelapplet.html


                      С этим понятно, но не совсем
                      К примеру, часы - это ехе-шник (clock.exe)
                      А в этом примере необходимо создавать cpl
                      Можно ли туда ручками промисать ссылку на ехе-шник?
                        Цитата -=CAP=- @
                        К примеру, часы - это ехе-шник (clock.exe)
                        А в этом примере необходимо создавать cpl

                        ну можно же создать мелкий cpl, который на DlbClick будет запускать нужный тебе exe.
                        Кстати, поглядел у себя на девайсе. \Windows\clock.exe размером 338 байт, \Windows\clоckdll.dll - 37Кб. т.е. так что функционал плагины Часы - все-таки находится в dll. а clock.exe - это непонятно что, возможно просто ссылка.
                          Вот небольшое решение:
                          Цитата kvv@home @
                          так что функционал плагины Часы - все-таки находится в dll. а clock.exe - это непонятно что, возможно просто ссылка
                          Пускай так, но все-таки не cpl, а dll !
                            Проблема в другом.
                            Откомпилил пример на C++ - работает.
                            Переписал то же на C# - не работает (в настройках даже не появляется иконки).

                            Хотя лучше бы понять, почему не работает ключ Redirect в реестре для часов (ветка HKLM\ControlPanel\Clock) :)

                            Помимо кода в ресурсах есть одна иконка и две строки
                            Вот код:
                            ExpandedWrap disabled
                              using DeviceApplication1.Properties;
                              using System;
                              using System.Drawing;
                              using System.Collections.Generic;
                              using System.Windows.Forms;
                               
                              namespace DeviceApplication1
                              {
                                  public static class My
                                  {
                                      const Byte NUM_APPLETS = 1;
                                      const Byte CPL_INIT = 1;
                                      const Byte CPL_GETCOUNT = 2;
                                      const Byte CPL_INQUIRE = 3;
                                      const Byte CPL_SELECT = 4;
                                      const Byte CPL_DBLCLK = 5;
                                      const Byte CPL_STOP = 6;
                                      const Byte CPL_EXIT = 7;
                                      const Byte CPL_NEWINQUIRE = 8;
                               
                                      struct NEWCPLINFO
                                      {
                                          public UInt32 dwSize;
                                          public UInt32 dwFlags;
                                          public UInt32 dwHelpContext;
                                          public Int32 lData;
                                          public IntPtr hIcon;
                                          public unsafe fixed Char szName[32];
                                          public unsafe fixed Char szInfo[64];
                                          public unsafe fixed Char szHelpFile[128];
                                      }
                               
                                      struct CPLINFO
                                      {
                                          public Int32 idIcon;
                                          public Int32 idName;
                                          public Int32 idInfo;
                                          public Int32 lData;
                                      }
                               
                                      public static Int32 CplInit(IntPtr hwndCpl, UInt32 msg, Int32 lParam1, Int32 lParam2)
                                      {
                                          //applets.Add(new CApplet1());
                                          return ~0;
                                      }
                               
                                      public static Int32 CplGetCount(IntPtr hwndCpl, UInt32 msg, Int32 lParam1, Int32 lParam2)
                                      {
                                          return 1;// applets.GetSize();
                                      }
                               
                                      public static Int32 CplInquire(IntPtr hwndCpl, UInt32 msg, Int32 lParam1, Int32 lParam2)
                                      {
                                          unsafe
                                          {
                                              CPLINFO* pInfo = (CPLINFO*)lParam2;
                               
                                              pInfo->idIcon = 1; // 2;
                                              pInfo->idName = 1;
                                              pInfo->idInfo = 2;
                                              pInfo->lData = 0;
                                          }
                                          return ~0;
                                      }
                               
                                      public static Int32 CplSelect(IntPtr hwndCpl, UInt32 msg, Int32 lParam1, Int32 lParam2)
                                      {
                                          UInt32 uAppNum = (UInt32)lParam1;
                                          Int32 lData = (Int32)lParam2;
                                          //CSTControlPanelApplet* pApplet = applets[uAppNum];
                                          //if (pApplet)
                                          //{
                                          //    pApplet->OnClick();
                                          //}
                               
                                          return 0;
                                      }
                               
                                      public static Int32 CplDblClick(IntPtr hwndCpl, UInt32 msg, Int32 lParam1, Int32 lParam2)
                                      {
                                          UInt32 uAppNum = (UInt32)lParam1;
                                          Int32 lData = (Int32)lParam2;
                                          //CSTControlPanelApplet* pApplet = applets[uAppNum];
                                          //if (pApplet)
                                          //{
                                          //    pApplet->OnClick();
                                          //}
                               
                                          return 0;
                                      }
                               
                                      public static Int32 CplNewInquire(IntPtr hwndCpl, UInt32 msg, Int32 lParam1, Int32 lParam2)
                                      {
                                          unsafe
                                          {
                                              NEWCPLINFO* pInfo = (NEWCPLINFO*)lParam2;
                               
                                              //CSTControlPanelApplet* pApplet = applets[lParam1];
                                              //if (pApplet)
                                              //{
                                                  pInfo->dwSize = (UInt32)sizeof(NEWCPLINFO);
                                                  pInfo->dwHelpContext = 0;
                                                  pInfo->hIcon = Resources.Icon1.Handle;
                                                  pInfo->lData = 0;
                                                  pInfo->szName[0] = '2'; //(LPCTSTR)pApplet->GetName());
                                                  pInfo->szName[1] = '\x00';
                                                  pInfo->szInfo[0] = '1'; //(LPCTSTR)pApplet->GetInfo());
                                                  pInfo->szInfo[1] = '\x00';
                                                  pInfo->szHelpFile[0] = '\x00';
                                              //}
                                          }
                                          return ~0;
                                      }
                               
                                      public static Int32 CplIdName(IntPtr hwndCpl, UInt32 msg, Int32 lParam1, Int32 lParam2)
                                      {
                                          return 1;
                                      }
                               
                                      public static Int32 CPlApplet(IntPtr hwndCpl, UInt32 msg, Int32 lParam1, Int32 lParam2)
                                      {
                                          switch (msg)
                                          {
                                              case CPL_INIT:
                                                  MessageBox.Show("CPL_INIT");
                                                  return CplInit(hwndCpl, msg, lParam1, lParam2);
                                              case CPL_GETCOUNT:
                                                  MessageBox.Show("CPL_GETCOUNT");
                                                  return CplGetCount(hwndCpl, msg, lParam1, lParam2);
                                              case CPL_INQUIRE:
                                                  MessageBox.Show("CPL_INQUIRE");
                                                  return CplInquire(hwndCpl, msg, lParam1, lParam2);
                                              case CPL_SELECT:
                                                  MessageBox.Show("CPL_SELECT");
                                                  return CplSelect(hwndCpl, msg, lParam1, lParam2);
                                              case CPL_DBLCLK:
                                                  MessageBox.Show("CPL_DBLCLK");
                                                  return CplDblClick(hwndCpl, msg, lParam1, lParam2);
                                              case CPL_NEWINQUIRE:
                                                  MessageBox.Show("CPL_NEWINQUIRE");
                                                  return CplNewInquire(hwndCpl, msg, lParam1, lParam2);
                                              //case CPL_IDNAME:
                                              //    return CplIdName(hwndCpl, msg, lParam1, lParam2);
                                          }
                                          
                                          return 0;
                                      }
                                  }
                               
                              }

                            Прикреплённый файлПрикреплённый файлDeviceApplication1.rar (10.45 Кбайт, скачиваний: 119)
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0393 ]   [ 15 queries used ]   [ Generated: 3.05.24, 12:33 GMT ]