Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C++Builder: Regedit Jump

Автор: http://srpj.narod.ru/

Прочитав эту статью, вы узнаете, как можно из своей программы запустить стандартный редактор реестра, открыть в нём определённый ключ и выбрать в ключе заданный параметр. Основа кода взята из исходника программы 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 будет занят в момент отправки ему сообщения, это не означает, что это сообщение не попадёт в будущем в его оконную процедуру и не будет обработано.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
Аноним
Мне нравитсяМне не нравится
29 декабря 2005, 17:45:10
Эта программа полезна тем, что помогает быстро попасть в нужное место реестра...

Вообще, M$ Registry Editor - страшно неудобная программа. Нет поля ввода адреса (всегда приходится "ходить" по реестру мышкой), и нет функции "Find All" (приходится при поиске по 10 минут тупо нажимать F3. А если бы было "Find All" - запустил поиск и пошел пить чай; вернулся - все результаты на экране).

Кто бы написал новый хороший редактор реестра?... Ей богу, сам бы взялся, но времени свободного у меня почти не бывает...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог