![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оповещение всех об изменениях в системном реестре [D7, WinXP]
Jetus © (2005-02-07 22:13:00)Здравствуйте, господа программисты!
Я изменяю некоторые данные в реестре (изменяю целое число в ключе "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;
однако это не помогает.
Что делать?
Jetus (2005-02-09 12:52:00) [1]Я ничего не понял... Какой еще сервис? Для чего его запускать? Как запускать?
DeadMeat (2005-02-09 12:27:00) [2]ИМХО.. Проще перезапустить сервис. Да и правильней наверняка. Ведь реагировать по сути должен только он.
Fay (2005-02-09 04:05:00) [3]#include
#include
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");
}
Jetus (2005-02-09 03:00:00) [4]2 Набережных С.
А можно небольшой примерчик, как с этой процедуркой работать?
Набережных С. (2005-02-08 21:26:00) [5]RegNotifyChangeKeyValue из сервиса.
Jetus (2005-02-08 20:47:00) [6]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 открывает/прячет папки Мгновенно, то мне надо перезагрузиться, чтобы папки открылись/исчезли.
Fay (2005-02-07 22:32:00) [7]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-levelwindows 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-ы.
Gero (2005-02-07 22:25:00) [8]Кто и как должен на это реагировать?