// Форматируем имя таблицы символов wchar_t *FormatCodePageName(UINT CodePage, wchar_t *CodePageName, size_t Length, bool &IsCodePageNameCustom) { if (!CodePageName || !Length) return CodePageName; // Пытаемся получить заданное пользоваталем имя таблицы символов FormatString strCodePage; strCodePage<<CodePage; FARString strCodePageName; if (GetRegKey(NamesOfCodePagesKey, strCodePage, strCodePageName, L"")) { Length = Min(Length-1, strCodePageName.GetLength()); IsCodePageNameCustom = true; } else IsCodePageNameCustom = false; if (*CodePageName) { // Под виндой на входе "XXXX (Name)", а, например, под wine просто "Name" wchar_t *Name = wcschr(CodePageName, L'('); if (Name && *(++Name)) { size_t NameLength = wcslen(Name)-1; if (Name[NameLength] == L')') { Name[NameLength] = L'\0'; } } if (IsCodePageNameCustom) { if (strCodePageName==Name) { DeleteRegValue(NamesOfCodePagesKey, strCodePage); IsCodePageNameCustom = false; return Name ? Name : CodePageName; } } else return Name ? Name : CodePageName; } if (IsCodePageNameCustom) { wmemcpy(CodePageName, strCodePageName, Length); CodePageName[Length] = L'\0'; } return CodePageName; }
// Каллбак для диалога редактирования имени кодовой страницы LONG_PTR WINAPI EditDialogProc(HANDLE hDlg, int Msg, int Param1, LONG_PTR Param2) { if (Msg==DN_CLOSE) { if (Param1==EDITCP_OK || Param1==EDITCP_RESET) { FARString strCodePageName; UINT CodePage = GetMenuItemCodePage(); FormatString strCodePage; strCodePage<<CodePage; if (Param1==EDITCP_OK) { wchar_t *CodePageName = strCodePageName.GetBuffer(SendDlgMessage(hDlg, DM_GETTEXTPTR, EDITCP_EDIT, 0)+1); SendDlgMessage(hDlg, DM_GETTEXTPTR, EDITCP_EDIT, (LONG_PTR)CodePageName); strCodePageName.ReleaseBuffer(); } // Если имя кодовой страницы пустое, то считаем, что имя не задано if (!strCodePageName.GetLength()) DeleteRegValue(NamesOfCodePagesKey, strCodePage); else SetRegKey(NamesOfCodePagesKey, strCodePage, strCodePageName); // Получаем информацию о кодовой странице CPINFOEX cpiex; if (GetCodePageInfo(CodePage, cpiex)) { // Формируем имя таблиц символов bool IsCodePageNameCustom = false; wchar_t *CodePageName = FormatCodePageName(CodePage, cpiex.CodePageName, sizeof(cpiex.CodePageName)/sizeof(wchar_t), IsCodePageNameCustom); // Формируем строку представления strCodePage.Clear(); FormatCodePageString(CodePage, CodePageName, strCodePage, IsCodePageNameCustom); // Обновляем имя кодовой страницы int Position = CodePages->GetSelectPos(); CodePages->DeleteItem(Position); MenuItemEx NewItem; NewItem.Clear(); NewItem.strName = strCodePage; NewItem.UserData = (char *)(UINT_PTR)CodePage; NewItem.UserDataSize = sizeof(UINT); CodePages->AddItem(&NewItem, Position); CodePages->SetSelectPos(Position, 1); } } } return DefDlgProc(hDlg, Msg, Param1, Param2); }
void WindowsPlatform::removeSyncFromLeftPane(QString, QString, QString uuid) { REGSAM samDesired = 0; int it = 1; if (IsWow64()) { samDesired = KEY_WOW64_64KEY; it++; } QString key = QString::fromUtf8("Software\\Classes\\CLSID\\%1").arg(uuid); for (int i = 0; i < it; i++) { DeleteRegKey(HKEY_CURRENT_USER, (LPTSTR)key.utf16(), samDesired); samDesired = 0; } key = QString::fromUtf8("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\NameSpace\\%1").arg(uuid); DeleteRegKey(HKEY_CURRENT_USER, (LPTSTR)key.utf16(), 0); key = QString::fromUtf8("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\HideDesktopIcons\\NewStartPanel"); DeleteRegValue(HKEY_CURRENT_USER, (LPTSTR)key.utf16(), (LPTSTR)uuid.utf16(), 0); }
bool CheckLeftPaneIcon(wchar_t *path, bool remove) { HKEY hKey = NULL; LONG result = RegOpenKeyEx(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\NameSpace", 0, KEY_READ | KEY_ENUMERATE_SUB_KEYS, &hKey); if (result != ERROR_SUCCESS) { return false; } DWORD retCode = ERROR_SUCCESS; WCHAR uuid[MAX_PATH]; DWORD uuidlen = sizeof(uuid); for (int i = 0; retCode == ERROR_SUCCESS; i++) { uuidlen = sizeof(uuid); uuid[0] = '\0'; retCode = RegEnumKeyEx(hKey, i, uuid, &uuidlen, NULL, NULL, NULL, NULL); if (retCode == ERROR_SUCCESS) { HKEY hSubKey; TCHAR subKeyPath[MAX_PATH]; swprintf_s(subKeyPath, MAX_PATH, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\NameSpace\\%s", uuid); result = RegOpenKeyEx(HKEY_CURRENT_USER, subKeyPath, 0, KEY_READ, &hSubKey); if (result != ERROR_SUCCESS) { continue; } DWORD type; TCHAR value[MAX_PATH]; DWORD valuelen = sizeof(value); result = RegQueryValueEx(hSubKey, L"", NULL, &type, (LPBYTE)value, &valuelen); RegCloseKey(hSubKey); if (result != ERROR_SUCCESS || type != REG_SZ || valuelen != 10 || memcmp(value, L"MEGA", 10)) { continue; } if (path) { bool found = false; swprintf_s(subKeyPath, MAX_PATH, L"Software\\Classes\\CLSID\\%s\\Instance\\InitPropertyBag", uuid); result = RegOpenKeyEx(HKEY_CURRENT_USER, subKeyPath, 0, KEY_READ, &hSubKey); if (result == ERROR_SUCCESS) { valuelen = sizeof(value); result = RegQueryValueEx(hSubKey, L"TargetFolderPath", NULL, &type, (LPBYTE)value, &valuelen); RegCloseKey(hSubKey); if (result == ERROR_SUCCESS && type == REG_EXPAND_SZ && !_wcsicmp(value, path)) { found = true; } } if (!found) { swprintf_s(subKeyPath, MAX_PATH, L"Software\\Classes\\CLSID\\%s\\Instance\\InitPropertyBag", uuid); result = RegOpenKeyEx(HKEY_CURRENT_USER, subKeyPath, 0, KEY_WOW64_64KEY | KEY_READ, &hSubKey); if (result == ERROR_SUCCESS) { valuelen = sizeof(value); result = RegQueryValueEx(hSubKey, L"TargetFolderPath", NULL, &type, (LPBYTE)value, &valuelen); RegCloseKey(hSubKey); if (result == ERROR_SUCCESS && type == REG_EXPAND_SZ && !_wcsicmp(value, path)) { found = true; } } } if (!found) { continue; } } if (remove) { wchar_t buffer[MAX_PATH]; swprintf_s(buffer, MAX_PATH, L"Software\\Classes\\CLSID\\%s", uuid); if (IsWow64()) { DeleteRegKey(HKEY_CURRENT_USER, buffer, KEY_WOW64_64KEY); } DeleteRegKey(HKEY_CURRENT_USER, buffer, 0); DeleteRegValue(HKEY_CURRENT_USER, (LPTSTR)L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\HideDesktopIcons\\NewStartPanel", uuid, 0); swprintf_s(buffer, MAX_PATH, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\NameSpace\\%s", uuid); DeleteRegKey(HKEY_CURRENT_USER, buffer, 0); } RegCloseKey(hKey); return true; } } RegCloseKey(hKey); return false; }
// Обработка добавления/удаления в/из список выбранных таблиц символов void ProcessSelected(bool select) { if (Opt.CPMenuMode && select) return; UINT itemPosition = CodePages->GetSelectPos(); UINT codePage = GetMenuItemCodePage(); if ((select && IsPositionFavorite(itemPosition)) || (!select && IsPositionNormal(itemPosition))) { // Преобразуем номер таблицы символов в строку FormatString strCPName; strCPName<<codePage; // Получаем текущее состояние флага в реестре int selectType = 0; GetRegKey(FavoriteCodePagesKey, strCPName, selectType, 0); // Удаляем/добавляем в ресестре информацию о выбранной кодовой странице if (select) SetRegKey(FavoriteCodePagesKey, strCPName, CPST_FAVORITE | (selectType & CPST_FIND ? CPST_FIND : 0)); else if (selectType & CPST_FIND) SetRegKey(FavoriteCodePagesKey, strCPName, CPST_FIND); else DeleteRegValue(FavoriteCodePagesKey, strCPName); // Создаём новый элемент меню MenuItemEx newItem; newItem.Clear(); newItem.strName = CodePages->GetItemPtr()->strName; newItem.UserData = (char *)(UINT_PTR)codePage; newItem.UserDataSize = sizeof(UINT); // Сохраняем позицию курсора int position=CodePages->GetSelectPos(); // Удаляем старый пункт меню CodePages->DeleteItem(CodePages->GetSelectPos()); // Добавляем пункт меню в новое место if (select) { // Добавляем разделитель, если выбранных кодовых страниц ещё не было // и после добавления останутся нормальные кодовые страницы if (!favoriteCodePages && normalCodePages>1) AddSeparator(MSG(MGetCodePageFavorites),CodePages->GetItemCount()-normalCodePages); // Ищем позицию, куда добавить элемент int newPosition = GetCodePageInsertPosition( codePage, CodePages->GetItemCount()-normalCodePages-favoriteCodePages, favoriteCodePages ); // Добавляем кодовою страницу в выбранные CodePages->AddItem(&newItem, newPosition); // Удаляем разделитель, если нет обыкновынных кодовых страниц if (normalCodePages==1) CodePages->DeleteItem(CodePages->GetItemCount()-1); // Изменяем счётчики нормальных и выбранных кодовых страниц favoriteCodePages++; normalCodePages--; position++; } else { // Удаляем разделитеь, если после удаления не останнется ни одной // выбранной таблицы символов if (favoriteCodePages==1 && normalCodePages>0) CodePages->DeleteItem(CodePages->GetItemCount()-normalCodePages-2); // Переносим элемент в нормальные таблицы, только если они показываются if (!Opt.CPMenuMode) { // Добавляем разделитель, если не было ни одной нормальной кодовой страницы if (!normalCodePages) AddSeparator(MSG(MGetCodePageOther)); // Добавляем кодовою страницу в нормальные CodePages->AddItem( &newItem, GetCodePageInsertPosition( codePage, CodePages->GetItemCount()-normalCodePages, normalCodePages ) ); normalCodePages++; } // Если в режиме скрытия нормальных таблиц мы удалили последнюю выбранную таблицу, то удаляем и разделитель else if (favoriteCodePages==1) CodePages->DeleteItem(CodePages->GetItemCount()-normalCodePages-1); favoriteCodePages--; if (position==CodePages->GetItemCount()-normalCodePages-1) position--; } // Устанавливаем позицию в меню CodePages->SetSelectPos(position>=CodePages->GetItemCount() ? CodePages->GetItemCount()-1 : position, 1); // Показываем меню if (Opt.CPMenuMode) CodePages->SetPosition(-1, -1, 0, 0); CodePages->Show(); } }