-------------------------------------------------------------------------------
                    ОПИСАНИЕ
-------------------------------------------------------------------------------
Данное приложение может использоваться
 * для перезапуска стандартного шелла на магнитолах kia/hyundai и вообще
   на любых устройствах с wince.
 * Для подмены окна и перехвата сообщений.
 * Для анализа активности приложений в wince.
 * И много для чего еще, поведение полностью настраивается файлом конфигурации.

Управление:
 * Окно можно перетаскивать
 * Тройной клик -- убрать сплеш-скрин
 * Клик -- листать лог
 * Повторный тройной клик -- выйти

-------------------------------------------------------------------------------
                    ФАЙЛ КОНФИГУРАЦИИ
-------------------------------------------------------------------------------
В папке conf находятся примеры конфигов, имя конфига должно быть таким же
как имя приложения, но с расширением .cfg

Конфиг состоит: 
 * из настроек приложения 
 * секций выполнения.
   Секции выполняются последовательно. Действия внутри каждой секции неразрывны
   (кроме PostWnd с timeout большим 0). Следует иметь в виду, что между
   секциями может прийти сообщение, которое поменяет порядок выполнения
   (если не используется immediateJump).

Правила написания файла конфишурации:
 1. Имя файл настроек должно быть таким же как имя приложения, но с расширением
    .cfg
 2. Файл настроек читается построчно, пробельные символы отсекаются.
    Строки могут быть следующего типа:
 2.1. Пустая строка (содержащая только пробельные символы) -- пропускается;
 2.2. Комментарий (строка начинающаяся с ; или #) -- пропускается;
 2.3. Секция [name]
 2.3.1 Имя секции регистронезависимо
 2.4. Аргумент name=value
 2.4.1 Имя аргумента регистронезависимо, пробельные символы для name и value
       также отсекаются;
 2.4.2 Целочисленные аргументы задаются как в десятичном так и
       в шеснадцатиричном виде, например, arg = 0x10 или arg = 16;
 2.4.3 Строковые аргументы могут иметь сразу до трех значений: arg = val1; val2
       Например, Wnd = Window Class; Window Title
 2.4.4 При необходимости можно указать строку с крайними пробельными символами
       таким образом: Wnd = ' Window Class '; 'Window Title    '
 2.4.5 Булевские аргументы могут принимать только значения yes и no
 2.4.6 Строковые аргументы могут включать переменные в виде ${name:default}
       Где name имя переменной, default - значение по умолчанию. Переменные
       хранятся в памяти приложения. Если переменная при обращении
       не найдена в памяти, будет попытка считать ее с диска из файла
       <каталог_приложения>\state\name.state
       Если считать из файла не удалось, будет использано значение по умолчанию
       Кроме того есть встроенная системная переменная $args, хранящая в себе
       параметры, с которыми запущено приложение.
       Пример использования переменных:
       
         [StartProc]
         path = \Storage Card\${lastapp;notepad.exe}; $args
   
-------------------------------------------------------------------------------
 1. НАСТРОЙКИ
-------------------------------------------------------------------------------
 Имя                Описание
 тип: по умолчанию
 
-------------------------------------------------------------------------------
 width              Ширина окна
 int: 420
-------------------------------------------------------------------------------
 height             Длина окна
 int: 450
-------------------------------------------------------------------------------
 x                  Координата x левого верхнего угла окна
 int: 0
-------------------------------------------------------------------------------
 y                  Координата y левого верхнего угла окна
 int: 0
-------------------------------------------------------------------------------
 splash             Путь до bmp файла, закрывает окно
 str: NULL
-------------------------------------------------------------------------------
 minimize           ShowWindow при старте запускается c SW_MINIMIZE
 bool: no 
-------------------------------------------------------------------------------
 hide               ShowWindow при старте запускается c SW_HIDE. Параметр
 bool: no           не совместим с предыдущим.
-------------------------------------------------------------------------------
 wClass             Класс окна
 str: LISA_RELOADER
-------------------------------------------------------------------------------
 wTitle             Заголовок окна
 str: Lisa Reloader
-------------------------------------------------------------------------------
 separator          Разделитель строк, имеющих несколько значений. Может быть
 str: ;             переопределен любой строкой.
                    Например, separator = sep и Arg = Value1 sep Value2
-------------------------------------------------------------------------------
 quote              Можно переопределить кавычку любой строкой.
 str: '             Например, quote = @# и Arg = @# Value1   @#
-------------------------------------------------------------------------------
 secondNoActivate   Второй экземпляр с таким же классом и заголовком
 bool: no           не активирует предыдущее окно
-------------------------------------------------------------------------------
 secondNoExit       Второй экземпляр с таким же классом и заголовком
 bool: no           не завершает работу
-------------------------------------------------------------------------------
 benchmark          Засечь время выполнения скрипта
 bool: no           
-------------------------------------------------------------------------------
 emptyAsNull        Трактовать пустые значения как NULL для вызова FindWindow
 bool: yes          
-------------------------------------------------------------------------------
 immediateJump      Немедленно приступать к выполнению следующей секции, если
 bool: no           текущая не является последней в цепочке.
                      В обычном режиме выполнение следующей секции ставится
                    в очередь сообщений на равне с системными сообщениями,
                    соответтственно цепочка выполнения может быть прервана.
                      Чтобы гарантированно отрабатывать все секции в цепочке,
                    необходимо включить данную опцию. В качестве побочного
                    эффекта можно увидеть задержки отрисовки окна.
-------------------------------------------------------------------------------


-------------------------------------------------------------------------------
 2. СЕКЦИИ
-------------------------------------------------------------------------------
 section            Имя секции
    argument1       Не обязательный аргумент
    argument2 !     Обязательный аргумент
    argument3 ...   Аргумент может повторяться многократно 
    argument4 = 0   Аргумент со значением по умолчанию

-------------------------------------------------------------------------------
 error              Служебная секция. Нельзя использовать
-------------------------------------------------------------------------------
 Wait               Секция ничего не делает (можно ждать с аргументом wait)
-------------------------------------------------------------------------------
 Stop               Секция останавливает обработку скрипта
-------------------------------------------------------------------------------
 Exit               Завершение работы
-------------------------------------------------------------------------------
 ListWnd            Отобразить список всех окон
-------------------------------------------------------------------------------
 PostWnd            Отправить сообщение msg с параметрами wParam и lParam окну
    timeout = 0     или окнам wnd (смотри описание аргумента wnd), используя
    wnd ...         PostMessage.
    msg = 0x0         Если указан timeout больший нуля, то ждем завершения
    wParam = 0x0    приложения, которому отправили сообщение, полезно
    lParam = 0x0    при отправлении WM_CLOSE. 
    useSend = no      Если useSend = yes, используем SendMessage вместо
    onSuccess       PostMessage.
    onError           Если onSuccess указан, в случае успеха переходим
                    к указанной секции.
                      Если onError указан, в случае ошибки функций FindWindow
                    или PostMessage переходим к указанной секции.
-------------------------------------------------------------------------------
 RepostWnd          Отправить сообщение, полученное в секции [WaitMsg] окну
    wnd ...         или окнам wnd (смотри описание аргумента wnd), используя
    onSuccess       PostMessage.
    onError           Если onSuccess указан, в случае успеха переходим
                    к указанной секции.
                      Если onError указан, в случае ошибки функций FindWindow
                    или PostMessage переходим к указанной секции.
-------------------------------------------------------------------------------
 FindWnd            Искать окно или окна wnd.
    wnd ...           Варианты check:
    check               foreground   - GetForegroundWindow
    onSuccess         Если onSuccess указан, в случае успеха переходим
    onError         к указанной секции.
                      Если onError указан и FindWindow не нашел хотя бы одно
                    окно или не пройдена проверка check переходим к указанной
                    секции.
-------------------------------------------------------------------------------
 SetWnd             Выполняем action для окна или окон wnd.
    action !          Варианты action:
    wnd ...             show         - ShowWindow, flags - второй параметр
    flags = 0x0         foreground   - SetForegroundWindow 
    onSuccess           focus        - SetFocus
    onError           Если onSuccess указан, в случае успеха переходим
                    к указанной секции.
                      Если onError указан и FindWindow не нашел хотя бы одно
                    окно или соответствующая функция вернула ошибку, переходим
                    к указанной секции
-------------------------------------------------------------------------------
 ListProc           Отобразать список всех процессов
    proc            Если указан proc, отобразить список окон этого процесса
                    Если proc = all, отобразить все процессы с окнами
-------------------------------------------------------------------------------
 KillProc           Убить процессы, перечисленные в proc, используя
    proc ...        TerminateProcess.
    onSuccess         Если onSuccess указан, в случае успеха переходим
    onError         к указанной секции.
                      Если onError указан и OpenProcess или TerminateProcess
                    вернули ошибку переходим к указанной секции
-------------------------------------------------------------------------------
 StartProc          Запустить процессы с параметрами, перечисленные в path,
    path ...        используя CreateProcess. 
    onSuccess         Если onSuccess указан, в случае успеха переходим
    onError         к указанной секции.
                      Если onError указан и CreateProcess вернули ошибку
                    переходим к указанной секции
                      Во второй части path может использоваться системная
                    переменная $args
-------------------------------------------------------------------------------
 LogMsg             Логировать все сообщения, кроме указанных в msg.
    msg ...         Также пропускать все сообщения, параметры которых равны
    wParam ...      указанным wParam и lParam. Другими словами аргументы задают
    lParam ...      фильтры.
-------------------------------------------------------------------------------
 RegMsg             Регистрировать сообщения для будущего перехвата с указанием
    handler !       секции обработчика. 0xFFFFFFFF означает любое значение
    msg !           параметра.
    wParam = 0xFFFFFFFF
    lParam = 0xFFFFFFFF
    
-------------------------------------------------------------------------------
 WaitMsg            Запустить перехват сообщений зарегистрированных ранее.
-------------------------------------------------------------------------------
 Input              Симулировать ввод с клавиатуры с помощью keybd_event.
    keyDown ...     Действия выполняются последовательно в том порядке,
    keyUp ...       как они указаны. Действий может быть сколько угодно.
    sleep ...         Значения keyDown и keyUp - 0x0 - 0xFF
                      Значение sleep - время задержки
-------------------------------------------------------------------------------
 Save               Сохранить значение value в переменные с именами name
    name ...          Если flush имеет значение yes, то переменные с именами
    value           name сохранятся в файлы <каталог_приложения>\state\*.state
    flush = no      При этом value указывать не обязательно, сохранение на диск
    set ...         будет с предыдущими значениями
                      Вместо name и value можно использовать запись
                    с использованием аргумента set, в этом случае конкретной
                    переменной будет присвоено конкретное значение.
-------------------------------------------------------------------------------
 Time               Работа со временем.
    mshift            mshift -- сдвиг времени в минутах относительно текущего
    tz              может быть как положительным, так и отрицательным
                      tz -- имя таймзоны, например, Russian Standard Time
                    Ниже смотрите информацию по таймзонам
-------------------------------------------------------------------------------
 Include            Включить секции, описанные в указанном файле.
    path !          Путь может быть как абсолютным, так и относительным.
                      Сразу после аргумента path будет вставленна первая секция
                    из указанного файла, поэтому при необходимости общие
                    аргументы типа label должны указваться до path
-------------------------------------------------------------------------------


-------------------------------------------------------------------------------
 3. АРГУМЕНТЫ
-------------------------------------------------------------------------------
 print              Служебный аргумент. Нельзя использовать
-------------------------------------------------------------------------------
 label              Может быть в любой секции. Задает метку секции, по ней
                    можно перейти в секцию используя onError или handler.
-------------------------------------------------------------------------------
 wait = 0           Может быть в любой секции. Задает время ожидания
                    в миллисекундах до перехода к следующей секции.
-------------------------------------------------------------------------------
 stop = no          Может быть в любой секции. Говорит о том, что секция
                    является последней, т.е. остановить выполнение скрипта.
-------------------------------------------------------------------------------
 jump               Может быть в любой секции. Метка безусловного перехода.
-------------------------------------------------------------------------------
 timeout            Время в миллисекундах
-------------------------------------------------------------------------------
 wnd                Строка с тремя значениями, первое -- это класс окна,
                    второе -- это заголовок окна, третье -- имя процесса.
                    Пример: Wnd = LISA_RELOADER; Lisa Reloader; LReloader.exe
                      Внимание! При использовании имени процесса выполнение
                    существенно замедляется, т.к. каждый раз происходит
                    перечисление всех процессов.
-------------------------------------------------------------------------------
 msg                Любое пользовательское или системное сообщение Windows.
                    Например, WM_CLOSE - 0x10
-------------------------------------------------------------------------------
 wParam             wParam для сообщения
-------------------------------------------------------------------------------
 lParam             lParam для сообщения
-------------------------------------------------------------------------------
 useSend            Флаг для PostWnd
-------------------------------------------------------------------------------
 action             Действие для SetWnd
-------------------------------------------------------------------------------
 flags              Параметр для ShowWindow в секции SetWnd
-------------------------------------------------------------------------------
 check              Проверка для FindWnd
-------------------------------------------------------------------------------
 proc               Имя процесса
-------------------------------------------------------------------------------
 path               Строка с двумя значениями, первое -- это путь до
                    исполняемого файла, второе -- это параметры запуска.
                    Пример: Wnd = \Storage Card\LisaReloader.exe; arg1 arg2
-------------------------------------------------------------------------------
 onSuccess          Метка обработчика ошибок. При успешном выполнении текущей
                    секции вместо перехода к следующей секции переходим
                    в указанную.
-------------------------------------------------------------------------------
 onError            Метка обработчика ошибок. При возникновении ошибки вместо
                    перехода к следующей секции переходим в указанную.
-------------------------------------------------------------------------------
 handler            Метка обработчика сообщения.
-------------------------------------------------------------------------------
 keyDown            Код клавиши в диапазоне 0x0 - 0xFF
-------------------------------------------------------------------------------
 keyUp              Код клавиши в диапазоне 0x0 - 0xFF
-------------------------------------------------------------------------------
 sleep              Время в миллисекундах
-------------------------------------------------------------------------------
 name               Имя переменной
-------------------------------------------------------------------------------
 value              Значение переменной
-------------------------------------------------------------------------------
 set                Установить значение переменной.
                    Пример: set = name; value
-------------------------------------------------------------------------------
 flush              Выгрузить изменения на диск
-------------------------------------------------------------------------------
 mshift             Сдвиг времени в минутах. Может быть как положительным,
                    так и отрицательным
-------------------------------------------------------------------------------
 tz                 Название таймзоны. Информацию по таймзонам смотрите ниже
-------------------------------------------------------------------------------


-------------------------------------------------------------------------------
 ПРИЛОЖЕНИЕ 1. Таймзоны
-------------------------------------------------------------------------------
В Win CE таймзоны перечислены в реестре по пути HKEY_LOCAL_MACHINE\Time Zones\
Для справки приведены таймзоны взятые с ШГУ с прошивкой 7.5.8
В скриптах нужно указывать значение из второй колонки

(GMT+13:00) Nuku'alofa                          Tonga Standard Time
(GMT+12:00) Auckland, Wellington                New Zealand Standard Time
(GMT+12:00) Fiji, Kamchatka, Marshall Is.       Fiji Standard Time
(GMT+11:00) Magadan, Solomon Is., New Caledonia Central Pacific Standard Time
(GMT+10:00) Guam, Port Moresby                  West Pacific Standard Time
(GMT+10:00) Vladivostok                         Vladivostok Standard Time
(GMT+10:00) Hobart                              Tasmania Standard Time
(GMT+10:00) Brisbane                            E. Australia Standard Time
(GMT+10:00) Canberra, Melbourne, Sydney         AUS Eastern Standard Time
(GMT+09:30) Adelaide                            Cen. Australia Standard Time
(GMT+09:30) Darwin                              AUS Central Standard Time
(GMT+09:00) Yakutsk                             Yakutsk Standard Time
(GMT+09:00) Osaka, Sapporo, Tokyo               Tokyo Standard Time
(GMT+09:00) Seoul                               Korea Standard Time
(GMT+08:00) Kuala Lumpur, Singapore             Singapore Standard Time
(GMT+08:00) Irkutsk, Ulaan Bataar               North Asia East Standard Time
(GMT+08:00) Perth                               W. Australia Standard Time
(GMT+08:00) Taipei                              Taipei Standard Time
(GMT+08:00) Beijing, Chongqing, Hong Kong, ...  China Standard Time
(GMT+07:00) Krasnoyarsk                         North Asia Standard Time
(GMT+07:00) Bangkok, Hanoi, Jakarta             SE Asia Standard Time
(GMT+06:30) Yangon (Rangoon)                    Myanmar Standard Time
(GMT+06:00) Almaty, Novosibirsk                 N. Central Asia Standard Time
(GMT+06:00) Astana, Dhaka                       Central Asia Standard Time
(GMT+05:45) Kathmandu                           Nepal Standard Time
(GMT+05:30) Sri Jayawardenepura                 Sri Lanka Standard Time
(GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi India Standard Time
(GMT+05:00) Islamabad, Karachi, Tashkent        West Asia Standard Time
(GMT+05:00) Ekaterinburg                        Ekaterinburg Standard Time
(GMT+04:30) Kabul                               Afghanistan Standard Time
(GMT+04:00) Baku                                Azerbaijan Standard Time
(GMT+04:00) Yerevan                             Caucasus Standard Time
(GMT+04:00) Abu Dhabi, Muscat                   Arabian Standard Time
(GMT+03:30) Tehran                              Iran Standard Time
(GMT+03:00) Tbilisi                             Georgian Standard Time
(GMT+03:00) Baghdad                             Arabic Standard Time
(GMT+03:00) Nairobi                             E. Africa Standard Time
(GMT+03:00) Kuwait, Riyadh                      Arab Standard Time
(GMT+03:00) Moscow, St. Petersburg, Volgograd   Russian Standard Time
(GMT+02:00) Beirut                              Middle East Standard Time
(GMT+02:00) Amman                               Jordan Standard Time
(GMT+02:00) Windhoek                            Namibia Standard Time
(GMT+02:00) Jerusalem                           Israel Standard Time
(GMT+02:00) Harare, Pretoria                    South Africa Standard Time
(GMT+02:00) Athens, Bucharest, Istanbul         GTB Standard Time
(GMT+02:00) Helsinki, Kyiv, Riga, Sofia, ...    FLE Standard Time
(GMT+02:00) Cairo                               Egypt Standard Time
(GMT+02:00) Minsk                               E. Europe Standard Time
(GMT+01:00) West Central Africa                 W. Central Africa Standard Time
(GMT+01:00) Amsterdam, Berlin, Bern, Rome, ...  W. Europe Standard Time
(GMT+01:00) Brussels, Copenhagen, Madrid, Paris Romance Standard Time
(GMT+01:00) Sarajevo, Skopje, Warsaw, Zagreb    Central European Standard Time
(GMT+01:00) Belgrade, Bratislava, Budapest...   Central Europe Standard Time
(GMT) Casablanca, Monrovia, Reykjavik           Greenwich Standard Time
(GMT) Greenwich Mean Time : Dublin, ...         GMT Standard Time
(GMT-01:00) Cape Verde Is.                      Cape Verde Standard Time
(GMT-01:00) Azores                              Azores Standard Time
(GMT-02:00) Mid-Atlantic                        Mid-Atlantic Standard Time
(GMT-03:00) Greenland                           Greenland Standard Time
(GMT-03:00) Buenos Aires, Georgetown            SA Eastern Standard Time
(GMT-03:00) Brasilia                            E. South America Standard Time
(GMT-03:30) Newfoundland                        Newfoundland Standard Time
(GMT-04:00) Manaus                              Central Brazilian Standard Time
(GMT-04:00) Santiago                            Pacific SA Standard Time
(GMT-04:00) Caracas, La Paz                     SA Western Standard Time
(GMT-04:00) Atlantic Time (Canada)              Atlantic Standard Time
(GMT-05:00) Bogota, Lima, Quito, Rio Branco     SA Pacific Standard Time
(GMT-05:00) Indiana (East)                      US Eastern Standard Time
(GMT-05:00) Eastern Time (US & Canada)          Eastern Standard Time
(GMT-06:00) Guadalajara, Mexico City, Monterrey Central Standard Time (Mexico)
(GMT-06:00) Central America                     Central America Standard Time
(GMT-06:00) Saskatchewan                        Canada Central Standard Time
(GMT-06:00) Central Time (US & Canada)          Central Standard Time
(GMT-07:00) Chihuahua, La Paz, Mazatlan         Mountain Standard Time (Mexico)
(GMT-07:00) Arizona                             US Mountain Standard Time
(GMT-07:00) Mountain Time (US & Canada)         Mountain Standard Time
(GMT-08:00) Tijuana, Baja California            Pacific Standard Time (Mexico)
(GMT-08:00) Pacific Time (US & Canada)          Pacific Standard Time
(GMT-09:00) Alaska                              Alaskan Standard Time
(GMT-10:00) Hawaii                              Hawaiian Standard Time
(GMT-11:00) Midway Island, Samoa                Samoa Standard Time
(GMT-12:00) International Date Line West        Dateline Standard Time