Изъятие стандартной темы ПК

FarlyTeem

Я хочу сделать так, чтобы при нажатии на кнопку в программе, открывалось новая форма уже со стандартной темой ПК, на котором была открыта эта программа. Можно ли это реализовать? И если можно, то как? Был бы очень благодарен)
11 ответов

FarlyTeem

Для начала, почему у вас программа в нестандартной теме?


FarlyTeem

Не так выразился У меня есть программа с нестандартной темой. Мне нужно сделать так, чтобы на кнопку открывалась новая форма, которая выглядит как стандартное окно виндовс (та версия, на которой запущена программа).


FarlyTeem

FarlyTeem, ничего не понятно. покажи хотя бы скриншот чего должно появиться?


FarlyTeem

Мне нужно замаскировать одну из форм моей программы под дефолтное загрузочное окно винды той версии, на которой запущена моя программа. Например, скидываю я кому-то экзешник, его открывают на windows XP и появляется загрузочное окно 1 в 1 как в этой же винде. Нужно так, чтобы пользователь поверил, что это именно загрузочник его винды, а не сторонней программы. Вроде бы подробно написал.Ну дык вот, это можно реализовать?


FarlyTeem

Ну дык вот
, а теперь попробуй объяснить, зачем это тебе понадобилось, кроме как для целей "украсть пароль, который не очень внимательный, но очень доверчивый пользователь введет в твое окно вместо системного"?


FarlyTeem

Ничего подобного я делать не собираюсь. Мне это нужно просто для небольшой программы-шутки. Спустя столько дней она уже не кажется такой забавной, как я сначала подумал, но я все равно хотел бы ее сделать. Однако, теперь мне больше интересна реализация такой программы.


FarlyTeem

Если используется стандартный вид интерфейса при создании приложении, разве он не "подстраивается" в зависимости от того, на какой версии виндовс запущен?


FarlyTeem

В том то и дело, что я хочу юзать нестандартный вид интерфейса в главном окне программы, а новая форма открывалась бы уже "подстроенной" к этой версии виндовс.


FarlyTeem

теперь мне больше интересна реализация такой программы
Для реализации такой штуки в WinAPI есть функция CredUIPromptForWindowsCredentials, которая выдаст стандартное окно ввода пароля для любой системы, начиная с Windows Vista. Причем ей совершенно не интересно, какой интерфейс у твоего приложения, стандартный или не очень:
#include <wincred.h>
#pragma comment(lib, "Credui.lib")
 
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    CREDUI_INFO info = {0};
    info.cbSize = sizeof(CREDUI_INFO);
    info.pszCaptionText = L"Заголовок";
    info.pszMessageText = L"Сообщение";
 
    ULONG authPack = 0;
    LPVOID authBuffer = NULL;
    ULONG authBufferSize = 0;
    BOOL save = false;
 
    DWORD ui_res = CredUIPromptForWindowsCredentials(&info, 0, &authPack,
        NULL, 0, &authBuffer, &authBufferSize, &save, CREDUIWIN_GENERIC);
        // тут обработка введенных пользователем данных
}
при нестандартном интерфейсе (тема Carbon) выдает вполне себе обычное окно


FarlyTeem

FarlyTeem, типа такой шутки?


FarlyTeem

Почему-то ваш код компилируется (я кое-что исправил), но при нажатии на кнопку ничего не происходит.Я нашел вот такой, но на открывающейся форме лежит картинка, которую я не могу убрать.
CREDUI_INFO cui;
TCHAR pszName[CREDUI_MAX_USERNAME_LENGTH+1];
TCHAR pszPwd[CREDUI_MAX_PASSWORD_LENGTH+1];
BOOL fSave;
DWORD dwErr;
 
cui.cbSize = sizeof(CREDUI_INFO);
cui.hwndParent = NULL;
cui.pszMessageText = TEXT("Enter administrator account information");
cui.pszCaptionText = TEXT("CredUITest");
cui.hbmBanner = NULL;
fSave = FALSE;
SecureZeroMemory(pszName, sizeof(pszName));
SecureZeroMemory(pszPwd, sizeof(pszPwd));
dwErr = CredUIPromptForCredentials(
    &cui,
    TEXT("TheServer"),
    NULL,
    0,
    pszName,
    CREDUI_MAX_USERNAME_LENGTH+1,
    pszPwd,
    CREDUI_MAX_PASSWORD_LENGTH+1,
    &fSave,
    CREDUI_FLAGS_GENERIC_CREDENTIALS |
    CREDUI_FLAGS_ALWAYS_SHOW_UI |
    CREDUI_FLAGS_DO_NOT_PERSIST);
 
if(!dwErr)
{
    SecureZeroMemory(pszName, sizeof(pszName));
    SecureZeroMemory(pszPwd, sizeof(pszPwd));
}
Можно узнать, как вы такой прогрессбар сделали? У меня прогрессбар выглядит по-другому и к тому же лагает.