Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > [BC++] реест - перейти по адресу


Автор: MuForum 12.11.2008, 01:48
Доброе время суток!
- Столкнулся со следующей проблемой, мне необходимо открыть редактор реестра и перейти по нужному ключу.
- Пытался следующие комбинации:
Код

        String FileName = "";
        String Key = "HKEY_LOCAL_MACHINE\Software\Microsoft\Shared Tools\MSConfig\startupfolder";
    try
    {
        ShellExecute(NULL, "open", "C:\\windows\\regedit.exe", ("/e " + Key).c_str(), NULL, SW_SHOWNORMAL);
        //ShellExecute(NULL, "open", "C:\\windows\\regedit.exe", PChar(Format("/e \"%s\" \"%s\"", [FileName, Key])), NULL, SW_SHOWNORMAL);
    }
    catch(...) {}

- Открывает только сам редактор, но по ключу не следует.

Автор: mrbrooks 12.11.2008, 09:22
MuForum, а зачем так изголятьсо когда есть класс TRegistry  smile 

Автор: MuForum 12.11.2008, 15:09
Цитата(mrbrooks @ 12.11.2008,  09:22)
MuForum, а зачем так изголятьсо когда есть класс TRegistry  smile

То есть, ты предлагаешь дойти до нужного ключа при помощи класса TRegistry, а окно редактора уже открыть через ShellExec()?

Код

OpenRegEdit(1, "\\Software\\Microsoft\\Shared Tools\\MSConfig\\startupfolder");
...
...
void __fastcall TForm1::OpenRegEdit(int Root, String Key)
{
        TRegistry *pReg = new TRegistry;
        pReg->RootKey = (Root == 0) ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE;
        pReg->OpenKey(Key, true);
        // ----
        try
        {
                ShellExecute(NULL, "open", "C:\\windows\\regedit.exe", NULL, NULL, SW_SHOWNORMAL);
        }
        catch(...) {}
        // ----
        pReg->CloseKey();
        delete pReg;
}

- Данный вариант не работает =(

Автор: MuForum 12.11.2008, 16:53
# for all - Не особо мне нравиться этот способ, но другого пока не вижу. (http://www.realcoding.net/article/view/817)

Код

void __fastcall TForm1::OpenRegEdit2(String KeyEdit)
{
        HWND Regedit = FindWindow("RegEdit_RegEdit", NULL), Tree, List;
        if(Regedit == NULL)
        {
                SHELLEXECUTEINFO info;
                ZeroMemory(&info, sizeof(SHELLEXECUTEINFO));
                info.cbSize = sizeof info;
                info.fMask = SEE_MASK_NOCLOSEPROCESS;
                info.lpVerb = "open";
                info.lpFile = "Regedit.exe";
                info.nShow = SW_SHOWNORMAL;
                ShellExecuteEx(&info);
                WaitForInputIdle(info.hProcess, INFINITE);
                Regedit = FindWindow("RegEdit_RegEdit", NULL);
        }
        // ----
        if(Regedit == NULL)
        {
                MessageDlg("nНевозможно запустить Regedit.exe.", mtError, TMsgDlgButtons()<<mbOK, 0);
                return;
        }
        // ----
        ShowWindow(Regedit, SW_MAXIMIZE);
        SetForegroundWindow(Regedit);
        Tree = FindWindowEx(Regedit, NULL, "SysTreeView32", NULL);
        PostMessage(Tree, WM_KEYDOWN, VK_HOME, 0);
        // ----
        DEVMODE dm;
        EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm);
        if(dm.dmBitsPerPel > 8) Sleep(500);
        // ----
        char *ch = KeyEdit.c_str();
        for(; *ch; ++ch)
        {
                if(*ch == '\\')
                {
                        PostMessage(Tree, WM_KEYDOWN, VK_RIGHT, 0);
                        if(dm.dmBitsPerPel > 8) Sleep(250);
                }
                else PostMessage(Tree, WM_CHAR, toupper(*ch), 0);
        }
}

Автор: mrbrooks 12.11.2008, 17:18
MuForum, а regedit'ом обязательно пользоваться? Я к тому что - используя TRegistry - ты можешь сделать с требуемым ключем все что нужно.

Автор: MuForum 12.11.2008, 17:20
Цитата(mrbrooks @ 12.11.2008,  17:18)
MuForum, а regedit'ом обязательно пользоваться? Я к тому что - используя TRegistry - ты можешь сделать с требуемым ключем все что нужно.

Я знаю, но вопрос был поставлен по другому!
- Мне нужно было открыть редактор сразу на указанном ключе.

Автор: mrbrooks 12.11.2008, 17:30
Цитата(MuForum @  12.11.2008,  17:20 Найти цитируемый пост)
Я знаю, но вопрос был поставлен по другому!

я его понял так, как я его понял. ок?

Автор: YanTsys 12.11.2008, 19:28
Цитата(MuForum @ 12.11.2008,  17:20)
Цитата(mrbrooks @ 12.11.2008,  17:18)
MuForum, а regedit'ом обязательно пользоваться? Я к тому что - используя TRegistry - ты можешь сделать с требуемым ключем все что нужно.

Я знаю, но вопрос был поставлен по другому!
- Мне нужно было открыть редактор сразу на указанном ключе.

Откуда у тебя информация что ключ /e это переход к определенной ветви реестра?

/s (импортирует значения из reg-файла без вывода диалогового окна)
/e (экспортирует параметры в reg-файл. Пример: regedit /e myfile.reg
HKEY_USERS\.DEFAULT

Добавлено через 2 минуты и 36 секунд
Нашел описание прикольного способа узнать ключи

Цитата

С какими ключами можно использовать regedit?

Чтобы получить список ключей, с которыми можно использовать regedit, загрузитесь с системной дискеты. Перейдите в каталог, содержащий редактор реестра и в командной строке выполните REGEDIT. На экране отобразится список ключей, используемых regedit`ом.

В отличие от большинства других исполняемых файлов, для вызова справки по regedit не нужно ставить после имени файла обратный слеш со знаком вопроса (/?).

Кроме указанных в справке ключей, есть недокументированный ключ /S, позволяющий выполнять команды без вывода предупреждений. Данный ключ работает только при запуске regedit через Пуск -> Выполнить -> Открыть.


Автор: THandle 12.11.2008, 21:13
Коряво... Но...

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TRegistry *Reg = new TRegistry;
    Reg->RootKey = HKEY_CURRENT_USER;
    Reg->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Regedit", False);
    Reg->WriteString("LastKey", "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Shared Tools\\MSConfig\\startupfolder");
    delete Reg;
    ShellExecute(Handle, "Open", "Regedit.exe", NULL, NULL, SW_SHOW);
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)