Как сообщить системе об изменении в реестре?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Как сообщить системе об изменении в реестре?

Сообщение arthur2 » 31.01.2009 (Сб) 10:19

Меняю ключ реестра:

[HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response]
"Flags"="122"

(это специальные возможности, способ включения фильтрации ввода)

Но изменение начинает работать только после перезагрузки. А мне надо, чтобы сразу. И чтобы потом вернуть всё как было :D

Как этого добиться? Ведь если менять настройку из панели управления, изменение действует сразу.
Артур
 
   

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Re: Как сообщить системе об изменении в реестре?

Сообщение Saturn.65 » 31.01.2009 (Сб) 11:05

Попробуй с этим примером. Создается любой ключ, записывается и число и строка, читается, а если надо, то удаляется. Кода две строчки, все элементарно, правда применяется reg.ocx.
Создать-прочитать ключи.rar
(15.82 Кб) Скачиваний: 154
Главное, ребята, сердцем не стареть...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сообщить системе об изменении в реестре?

Сообщение Хакер » 31.01.2009 (Сб) 11:18

arthur2, проверь, нельзя ли этот параметр изменить через SPI-API.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сообщить системе об изменении в реестре?

Сообщение arthur2 » 31.01.2009 (Сб) 11:25

Нет, проблема не в том, как записать в реестр, а в том, как потом сказать системе, что я записал. Как записать, я знаю: RegSetValueEx

Твой пример делает то же самое: ключ меняется, но способ включения фильтрации ввода остаётся прежним - пока не перезагрузишься. То есть, проблема так и осталась на месте :(

Хакер
Подскажи, что это такое SPI-API?

Поиск выдаёт что-то непонятное или не о том :(
Последний раз редактировалось arthur2 31.01.2009 (Сб) 11:31, всего редактировалось 1 раз.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сообщить системе об изменении в реестре?

Сообщение Хакер » 31.01.2009 (Сб) 11:30

SystemParametersInfo и куча констант, начинающихся на SPI.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сообщить системе об изменении в реестре?

Сообщение arthur2 » 31.01.2009 (Сб) 11:38

Хакер
Было бы здорово - судя по описанию, то что надо! Изменить настройки без записи в реестр :)

Но нужной константы найти, увы, не смог :(
Артур
 
   

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Как сообщить системе об изменении в реестре?

Сообщение alibek » 31.01.2009 (Сб) 12:06

Флаг 0x00000002 не оно (spifSendWinINIChange)?
Lasciate ogni speranza, voi ch'entrate.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сообщить системе об изменении в реестре?

Сообщение arthur2 » 31.01.2009 (Сб) 13:54

alibek
Нет, эту-то константу я как раз нашёл сразу и она мне очень понравилась... то есть, не она, а её антипод siDoNotUpdateINIFile Мне как раз нужно, чтобы мои изменения не сохранялись.

А найти я не мог константы для отключения залипания клавиш и фильтрации ввода.

Собственно, нашёл :) Сначала нашёл здоровский модуль от GSerg http://www.vbstreets.ru/VB/Sources/65777.aspx

А потом и константы. Вот:
SPI_GETSTICKYKEYS Retrieves information about the StickyKeys accessibility feature. The pvParam parameter must point to a STICKYKEYS structure that receives the information. Set the cbSize member of this structure and the uiParam parameter to sizeof(STICKYKEYS).

SPI_GETFILTERKEYS Retrieves information about the FilterKeys accessibility feature. The pvParam parameter must point to a FILTERKEYS structure that receives the information. Set the cbSize member of this structure and the uiParam parameter to sizeof(FILTERKEYS).
И аналогичные SPI_SETFILTERKEYS SPI_SETFILTERKEYS

По аналогии с примером от GSerg наваял такой код (снятие-установка способа включения залипания клавиш):

модуль SystemInfo
Код: Выделить всё
Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" ( _
                  ByVal uAction As Long, _
                  ByVal uParam As Long, _
                  lpvParam As Any, _
                  ByVal fuWinIni As Long) As Long
Public Type STICKKYKEYS
   cbSize As Long
   dwFlags As Long
End Type

Public Const SKF_HOTKEYACTIVE = 4
Private Const SPI_GETSTICKYKEYS = 58
Private Const SPI_SETSTICKYKEYS = 59

Property Get stickkyKeysInf() As STICKKYKEYS 
  stickkyKeysInf.cbSize = Len(stickkyKeysInf)
  SystemParametersInfo SPI_GETSTICKYKEYS, stickkyKeysInf.cbSize, stickkyKeysInf, 0&
End Property
'typedef struct tagSTICKYKEYS {
'    DWORD  cbSize;
'    DWORD  dwFlags;
'} STICKYKEYS, *LPSTICKYKEYS;

Property Let stickkyKeysInf(st As STICKKYKEYS)
  st.cbSize = Len(st)
  SystemParametersInfo SPI_SETSTICKYKEYS, st.cbSize, st, 0&
End Property

Использование:
Код: Выделить всё
Private Sub setStickkyKeysHotKeyActive(YesNo As Boolean)
   
    Dim st As STICKKYKEYS
   
    st = SystemInfo.stickkyKeysInf
 
  If YesNo Then
    st.dwFlags = st.dwFlags Or SKF_HOTKEYACTIVE
  Else
    st.dwFlags = st.dwFlags And (Not SKF_HOTKEYACTIVE)
  End If
    SystemInfo.stickkyKeysInf = st
End Sub


Всё работает! Спасибо огромное за наводку :)

Один вопросик вдогонку: для включения-выключения того же самого у фильтрации ввода нужна структура:
Код: Выделить всё
typedef struct tagFILTERKEYS { 
    UINT   cbSize;
    DWORD  dwFlags;
    DWORD  iWaitMSec;
    DWORD  iDelayMSec;
    DWORD  iRepeatMSec;
    DWORD  iBounceMSec;
} FILTERKEYS *LPFILTERKEYS;

Что за тип UINT? Это Long?
Артур
 
   

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как сообщить системе об изменении в реестре?

Сообщение iGrok » 31.01.2009 (Сб) 13:59

Да.
label:
cli
jmp label

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Как сообщить системе об изменении в реестре?

Сообщение MIT » 31.01.2009 (Сб) 14:23

не совсем - это беззнаковый long
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сообщить системе об изменении в реестре?

Сообщение arthur2 » 31.01.2009 (Сб) 14:52

MIT, iGrok
Спасибо, понятно :) в общем, для этого конкретного случая - просто long.
не она, а её антипод siDoNotUpdateINIFile Мне как раз нужно, чтобы мои изменения не сохранялись
Упс... это я ступил. Они вовсе не антиподы :)
siDoNotUpdateINIFile = &H0& Не сохранять изменений и ничего никому не сообщать (пока сами не заметят)
siUpdateINIFile = &H1& Сохранить изменения
siSendWinINIChange = &H2& Сообщить всем, что произошли изменения
siUpdateINIFile or siSendWinINIChange и сохранить, и сообщить
Артур
 
   

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как сообщить системе об изменении в реестре?

Сообщение iGrok » 31.01.2009 (Сб) 19:17

MIT писал(а):не совсем - это беззнаковый long

Если ещё точнее, то это Unsigned Integer, или беззнаковое 32х-битное целое, полного аналога которому в VB6 просто нету, но аналогом которому в данном конкретном случае может послужить Long.

Такое определение кажется тебе более правильным? =)
Мне просто влом было писать всю фразу целиком. Тем более, достаточно было ответа "Да." =)
label:
cli
jmp label

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сообщить системе об изменении в реестре?

Сообщение arthur2 » 31.01.2009 (Сб) 20:05

iGrok
Любопытно, а нафига в этой структуре именно беззнаковое целое? Причем, для размера структуры, который всегда один и тот же? Тем более что в аналогичной структуре STICKYKEYS это же поле - dword :)
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сообщить системе об изменении в реестре?

Сообщение Хакер » 31.01.2009 (Сб) 20:55

Затем, что размер структуры может быть не один и тот же. Например, в Висте эту структуру захотят расширить. Старые проги будут передавать маленькую структуру, новые — б`ольшую, чем старая. По содержимому этого поля система точно определит, какого размера структура, чтобы никаких ошибок "переполнения буфера" никогда не произошло.

unsigned — потому, что размер структуры не может быть отрицательным (вопрос стиля программирования). Потому что в сравнится не надо менять знаковые квалификаторы (проще говоря: не надо кастовать к unsigned) при сравнении (вопрос непоявления варнингов от компилятора). Потому, что операции с unsigned быстрее (вопрос быстродействия).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как сообщить системе об изменении в реестре?

Сообщение iGrok » 31.01.2009 (Сб) 20:56

arthur2 писал(а):iGrok
Любопытно, а нафига в этой структуре именно беззнаковое целое? Причем, для размера структуры, который всегда один и тот же? Тем более что в аналогичной структуре STICKYKEYS это же поле - dword :)


А скорей всего, так захотела левая пятка человека, написавшего именно это определение..

UPD: А, кстати, похоже так и есть:
http://www.tech-archive.net/Archive/VC/ ... 01452.html

Хотя по-моему, действительно объявление как Unsigned будет более правильным, чем как Signed. Почему - написал Хакер постом выше..
У меня правда, пояснение попроще было - "А разве размер может быть отрицательным?" =)
label:
cli
jmp label

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сообщить системе об изменении в реестре?

Сообщение arthur2 » 31.01.2009 (Сб) 21:08

unsigned — потому, что размер структуры не может быть отрицательным (вопрос стиля программирования). Потому что в сравнится не надо менять знаковые квалификаторы (проще говоря: не надо кастовать к unsigned) при сравнении (вопрос непоявления варнингов от компилятора). Потому, что операции с unsigned быстрее (вопрос быстродействия)


В общем, и понятно и убедительно. Но тогда зачем в STICKYKEYS это же поле - dword? Видимо, эту структуру разрабатывал кто-то с не очень хорошим стилем :)

А вообще - это я уже так, от любопытства
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сообщить системе об изменении в реестре?

Сообщение Хакер » 31.01.2009 (Сб) 21:22

Потому что если я правильно помню, DWORD это типо-псевдоним для типа unsigned int, объёвленный через typedef.

То что для unsigned — точно,а вот точно ли, что для int (а не long) — есть сомнения.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Re: Как сообщить системе об изменении в реестре?

Сообщение Александр Дмитриев » 31.01.2009 (Сб) 21:57

Хакер писал(а):Потому что если я правильно помню, DWORD это типо-псевдоним для типа unsigned int, объёвленный через typedef.

То что для unsigned — точно,а вот точно ли, что для int (а не long) — есть сомнения.
DWORD -для long, а UINT - для int.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 43

    TopList