Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Вниз

Оповещение всех об изменениях в системном реестре   Найти похожие ветки 

 
Jetus ©   (2005-02-07 22:13) [0]

Здравствуйте, господа программисты!
Я изменяю некоторые данные в реестре (изменяю целое число в ключе "ItemsCount"):

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HFSYS\Parameters]
"ItemsCount"=dword:00000003

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

procedure TForm1.Button1Click(Sender: TObject);
begin
 SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0,
   LongInt(PChar("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HFSYS\Parameters")));
end;

однако это не помогает.

Что делать?


 
Gero ©   (2005-02-07 22:25) [1]

Кто и как должен на это реагировать?


 
Fay ©   (2005-02-07 22:32) [2]

2 Jetus ©   (07.02.05 22:13)
Если склероз мне не изменяет, то ты в LParam передаёшь указатель "куда-то". Готовься к AV.

>> SendMessage(HWND_BROADCAST, ...
If this parameter is HWND_BROADCAST, the message is sent to all top-level windows in the system, including disabled or invisible unowned windows, overlapped windows, and pop-up windows; but the message is not sent to child windows

top-level, грубо говоря, в случае Delphi - это Application.

P.S.
IMHO, в твоём случае нужны mailslot-ы.


 
Jetus ©   (2005-02-08 20:47) [3]

2 Fay
Просвети меня, причем тут вообще mailslot-ы???

2 Gero ©   (07.02.05 22:25) [1]
>> Кто и как должен на это реагировать?

Рассказываю. Есть одна наплохая програмка Hide Folder, которая может скрывать папки в ХР, да так, что ни один файловый менеджер не видит. А работает она через реестр. В ветке
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HFSYS\Parameters"
есть ключи:
"ItemsCount"=dword:00000003  //это сколько таких вот скрытых папок вообще есть
"Item0"="C:\HideMe\"  //Это одна из папок которую надо скрыть

Так вот, я хочу написать прогу, которая будет лучше чем Hide Folder, однако тогда как Hide Folder открывает/прячет папки Мгновенно, то мне надо перезагрузиться, чтобы папки открылись/исчезли.


 
Набережных С. ©   (2005-02-08 21:26) [4]

RegNotifyChangeKeyValue из сервиса.


 
Jetus ©   (2005-02-09 03:00) [5]

2 Набережных С.

А можно небольшой примерчик, как с этой процедуркой работать?


 
Fay ©   (2005-02-09 04:05) [6]

#include <stdio.h>
#include <windows.h>

void main(int argc, char *argv[])
{
DWORD  dwFilter = REG_NOTIFY_CHANGE_NAME |
                 REG_NOTIFY_CHANGE_ATTRIBUTES |
                 REG_NOTIFY_CHANGE_LAST_SET |
                 REG_NOTIFY_CHANGE_SECURITY;

HANDLE hEvent;
HKEY   hMainKey;
HKEY   hKey;
LONG   lErrorCode;

// Display the usage error message.
if (argc != 3)
{
   printf("Usage: notify [HKLM/HKU/HKCU/HKCR/HCC] [subkey]\n");
   return;
}

// Convert parameters to appropriate handles.
if (strcmp("HKLM", argv[1]) == 0)
  hMainKey = HKEY_LOCAL_MACHINE;
else if (strcmp("HKU", argv[1]) == 0)
  hMainKey = HKEY_USERS;
else if (strcmp("HKCU", argv[1]) == 0)
  hMainKey = HKEY_CURRENT_USER;
else if (strcmp("HKCR", argv[1]) == 0)
  hMainKey = HKEY_CLASSES_ROOT;
else if (strcmp("HCC", argv[1]) == 0)
  hMainKey = HKEY_CURRENT_CONFIG;
else
{
   printf("Usage: notify [HKLM/HKU/HKCU/HKCR/HCC] [subkey]\n");
   return;
}

// Open a key.
lErrorCode = RegOpenKeyEx(hMainKey, argv[2], 0, KEY_NOTIFY, &hKey);
if (lErrorCode != ERROR_SUCCESS)
  printf("Error in RegOpenKeyEx.\n");

// Create an event.
hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (hEvent == NULL)
   printf("Error in CreateEvent.\n");

// Watch the registry key for a change of value.
lErrorCode = RegNotifyChangeKeyValue(hKey,
                                    TRUE,
                                    dwFilter,
                                    hEvent,
                                    TRUE);
if (lErrorCode != ERROR_SUCCESS)
  printf("Error in RegNotifyChangeKeyValue.\n");

// Wait for an event to occur.
if (WaitForSingleObject(hEvent, INFINITE) == WAIT_FAILED)
  printf("Error in WaitForSingleObject.\n");

// Close the key.
lErrorCode = RegCloseKey(hKey);
if (lErrorCode != ERROR_SUCCESS)
  printf("Error in RegCloseKey.\n");

// Close the handle.
if (!RegCloseKey(hEvent))
  printf("Error in RegCloseKey.\n");
}


 
DeadMeat ©   (2005-02-09 12:27) [7]

ИМХО.. Проще перезапустить сервис. Да и правильней наверняка. Ведь реагировать по сути должен только он.


 
Jetus ©   (2005-02-09 12:52) [8]

Я ничего не понял... Какой еще сервис? Для чего его запускать? Как запускать?



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.037 c
14-1109539200
saNat
2005-02-28 00:20
2005.03.20
Программирование PIC-микроконтроллеров


4-1107489071
guest_Dmitry
2005-02-04 06:51
2005.03.20
Открытие/закрытие приложения, ...


9-1103806612
Макс
2004-12-23 15:56
2005.03.20
Editable mesh


1-1110119850
smok_red
2005-03-06 17:37
2005.03.20
ActionMainMenuBar и его работа с MDI приложением


14-1109859899
аноним_
2005-03-03 17:24
2005.03.20
Вопрос по javascript





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский