Mar
11

Как сменить тему в Windows Mobile программно

Как сменить тему в Windows Mobile программноЗадался тут вопросом о программной смене темы в Windows Mobile. Оказывается это не так просто, как может показаться. Информация с MSDN’овских форумов и из самой MSDN мягко говоря не соответствует действительности. В Интернете полно топиков с подобными вопросами, но вменяемый результат выудить оттуда тоже почти нереально.

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

Но перед тем, как мы перейдем к рассмотрению примера, давайте, все же, определимся с последовательностью действий:

  • Имя файла текущей темы находится в реестре по адресу “HKEY_CURRENT_USER\Software\Microsoft\Today\Skin”
  • Первым шагом для смены темы в Windows Mobile является запуск утилиты \Windows\wcrload.exe c параметрами /noui /nouninstall /delete 0 “путь_к_файлу_темы.tsk” (кавычки нужны для того, чтобы правильно обрабатывались пути с пробелами. Это важно!).
  • Затем надо удалить в реестре значение по адресу “HKEY_LOCAL_MACHINE\Software\Microsoft\Color\BaseHue” иначе после применения темы изменится только фоновая картинка в Today, а цветовая схема останется прежней (тоже долго искал почему не применяется тема полностью, это тоже важный момент).
  • Затем надо удалить значение в реестре по адресу “HKEY_CURRENT_USER\Software\Microsoft\Today\UseStartImage”.
  • После этого нужно прописать прописать путь к файлу темы в реестре по адресу “HKEY_CURRENT_USER\Software\Microsoft\Today\Skin”.
  • И последнее, что нужно сделать, это разослать всем окнам сообщение об изменении настроек системы с помощью ::PostMessage(HWND_BROADCAST, WM_WININICHANGE, 0xF2, 0)

А теперь пример:

#ifndef _MOBILE_THEME_SWITCH_H
#define _MOBILE_THEME_SWITCH_H

#include 
#include 
#include 

class MobileThemeSwitch
{
public:
        static wxString GetTheme()
        {
                wxString result;
                do 
                {
                        wxRegKey key(wxRegKey::HKCU, wxT("Software\\Microsoft\\Today"));
                        if(!key.Exists()) break;
                        if(!key.Open(wxRegKey::Read)) break;
                        const wxString skinValueName(wxT("Skin"));
                        if(!key.HasValue(skinValueName)) break;
                        if(!key.QueryValue(skinValueName, result)) break;
                } 
                while (false);
                if(result.IsEmpty()) result = _("default");
                return result;
        }
        static bool SetTheme(const wxString & value)
        {
                wxRegKey  * key(NULL);
                do 
                {
                        wxString wceLoadFileName = wxT("\\Windows\\wceload.exe");
                        if(!wxFileExists(wceLoadFileName)) 
                        {
                                wxLogDebug(_("'wceload.exe' does not exist"));
                                break;
                        }
                        wxString commandLine = wxString::Format(
                                wxT("%s /noui /nouninstall /delete 0 \"%s\""),
                                wceLoadFileName.GetData(),
                                value.GetData());
                        long execResult = wxExecute(commandLine, wxEXEC_SYNC);
                        if(execResult != 0)
                        {
                                wxLogDebug(_("'wceload.exe' returned error (%l)"), execResult);
                                break;
                        }
                        key = new wxRegKey(wxRegKey::HKLM, wxT("Software\\Microsoft\\Color"));
                        if(!key->Exists())
                        {
                                wxLogDebug(_("'Software\\Microsoft\\Color' registry key does not exist"));
                                break;
                        }
                        if(!key->Open(wxRegKey::Write))
                        {
                                wxLogDebug(_("Unable to open registry key 'Software\\Microsoft\\Color'"));
                                break;
                        }
                        const wxString baseHueValueName(wxT("BaseHue"));
                        if(key->HasValue(baseHueValueName))
                        {
                                key->DeleteValue(baseHueValueName);
                        }
                        key->Close();
                        wxDELETE(key);
                        key = new wxRegKey(wxRegKey::HKCU, wxT("Software\\Microsoft\\Today"));
                        if(!key->Exists())
                        {
                                wxLogDebug(_("'Software\\Microsoft\\Today' registry key does not exist"));
                                break;
                        }
                        if(!key->Open(wxRegKey::Write))
                        {
                                wxLogDebug(_("Unable to open registry key 'Software\\Microsoft\\Today'"));
                                break;
                        }
                        const wxString useStartImageValueName(wxT("UseStartImage"));
                        if(key->HasValue(useStartImageValueName))
                        {
                                key->DeleteValue(useStartImageValueName);
                        }
                        const wxString skinValueName(wxT("Skin"));
                        if(!key->SetValue(skinValueName, value))
                        {
                                wxLogDebug(_("Unable to change value 'Skin' in 'Software\\Microsoft\\Today'"));
                                break;
                        }
                        key->Close();
                        wxDELETE(key);
                        ::PostMessage(HWND_BROADCAST, WM_WININICHANGE, 0xF2, 0);
                        return true;
                } 
                while (false);
                wxDELETE(key);
                return false;
        }
};

#endif

Скачать исходный код примера + исполняемый файл для Windows Mobile 6.0.

Еще интересные посты о программировании для мобильных устройств:

No Comments

Make A Comment

No comments yet.

Comments RSS Feed   TrackBack URL

Leave a comment

Please leave these two fields as-is:
Студия Русские Узоры - салон татуировок. Хотите тату? У нас от 1000 руб. ; СтанДом - сайт о том как построить деревянную постройку!

top