Исходники
Статьи
Языки программирования
.NET Delphi Visual C++ Borland C++ Builder C/С++ и C# Базы Данных MySQL MSSQL Oracle PostgreSQL Interbase VisualFoxPro Веб-Мастеру PHP HTML Perl Java JavaScript Протоколы AJAX Технология Ajax Освоение Ajax Сети Беспроводные сети Локальные сети Сети хранения данных TCP/IP xDSL ATM Операционные системы Windows Linux Wap Книги и учебники
Скрипты
Магазин программиста
|
C++Builder: Regedit JumpПрочитав эту статью, вы узнаете, как можно из своей программы запустить стандартный редактор реестра, открыть в нём определённый ключ и выбрать в ключе заданный параметр. Основа кода взята из исходника программы Regmon (www.sysinternals.com). Создаём новое приложение и примерно такую форму: Рис 1. Форма будущей программы Как видно из рисунка, в поле Key вводится имя ключа, который необходимо открыть, а далее выбирается, нужно ли выделять определённый параметр и если да, то задаётся имя этого параметра. Поля ввода у меня названы, соответственно, KeyEdit и ValueEdit; имя флажка - ValueCB. Заполняем обработчик нажатия на кнопку Go: 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); SendMessage(Tree,WM_KEYDOWN,VK_HOME,0); DEVMODE dm; EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&dm); if(dm.dmBitsPerPel>8)Sleep(750); char *ch=KeyEdit->Text.c_str(); for(; *ch; ++ch) { if(*ch=='\\') { SendMessage(Tree,WM_KEYDOWN,VK_RIGHT,0); if(dm.dmBitsPerPel>8)Sleep(750); } else SendMessage(Tree,WM_CHAR,toupper(*ch),0); } if(ValueCB->Checked) { List=FindWindowEx(Regedit,NULL,"SysListView32",NULL); SetForegroundWindow(List); ::SetFocus(List); Sleep(1000); SendMessage(List,WM_KEYDOWN,VK_HOME,0); ch=ValueEdit->Text.c_str(); for(; *ch; ++ch) SendMessage(List,WM_CHAR,toupper(*ch),0); } Начинается код с поиска окна с классом "RegEdit_RegEdit" (как узнать класс окна, см. конец статьи). Если это окно не найдено, следовательно, редактор реестра не запущен, и мы запускаем его вручную, после чего снова ищем это окно. Если и в этот раз нас постигла неудача, то выходим из процедуры с сообщением об ошибке. Если же всё нормально, активируем Regedit и разворачиваем его окно на весь экран. Далее получаем дескриптор списка ключей (имеющий класс "SysTreeView32") в окне Regedit'а. Чтобы перейти на начало списка, эмулируем нажатие клавиши Home. После этого мы получаем установленное количество бит на пиксель и если оно больше 8 (т. е. >256 цветов), то необходимо немного подождать, для уверенности что Regedit выполнил посланную ему команду, что и делает функция Sleep. Смысл дальнейшего кода заключается в отправке списку ключей символов из поля KeyEdit, что заставит Regedit последовательно выделять нужные нам ключи, пока не дойдём до конечного (кстати, аналогичный метод работы можно использовать с папками в которых много файлов, а вам нужно выделить один из них - для этого достаточно просто ввести с клавиатуры его имя). В конце кода, если необходимо выделить какой-то параметр ключа, аналогично ищем список параметров, имеющий класс "SysListView32", активируем его и вышеописанным способом выделяем нужный параметр. Строго говоря, не обязательно писать название корневых разделов полностью. Например, чтобы выделить HKEY_LOCAL_MACHINE, достаточно написать просто HKEY_L. P.S. Недостаток приложения состоит в том, что оно:
Если нужна более высокая скорость выделения ключей, задержки можно убрать, т. к. даже если Regedit будет занят в момент отправки ему сообщения, это не означает, что это сообщение не попадёт в будущем в его оконную процедуру и не будет обработано. |
Форум Программиста
Новости Обзоры Магазин Программиста Каталог ссылок Поиск Добавить файл Обратная связь Рейтинги
|