На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
  
> Изменение строки в реестре без перезагрузки , Windows 10 x64
    Здравствуйте!
    Необходимо изменить значение параметра в реестре без перезагрузки Windows.
    Пожалуйста, подскажите, что не так у меня.
    Ничего не меняется.

    ExpandedWrap disabled
      Option Explicit
       
       
         Private Const REG_SZ As Long = 1
         Private Const REG_DWORD As Long = 4
       
         Private Const HKEY_CLASSES_ROOT = &H80000000
         Private Const HKEY_CURRENT_USER = &H80000001
         Private Const HKEY_LOCAL_MACHINE = &H80000002
         Private Const HKEY_USERS = &H80000003
       
         Private Const ERROR_NONE = 0
         Private Const ERROR_BADDB = 1
         Private Const ERROR_BADKEY = 2
         Private Const ERROR_CANTOPEN = 3
         Private Const ERROR_CANTREAD = 4
         Private Const ERROR_CANTWRITE = 5
         Private Const ERROR_OUTOFMEMORY = 6
         Private Const ERROR_ARENA_TRASHED = 7
         Private Const ERROR_ACCESS_DENIED = 8
         Private Const ERROR_INVALID_PARAMETERS = 87
         Private Const ERROR_NO_MORE_ITEMS = 259
       
         Private Const KEY_QUERY_VALUE = &H1
         Private Const KEY_SET_VALUE = &H2
         Private Const KEY_ALL_ACCESS = &H3F
       
          Private Const REG_OPTION_NON_VOLATILE = 0
          Private Const SE_PRIVILEGE_ENABLED    As Long = 2&
          Private Const TOKEN_ADJUST_PRIVILEGES As Long = &H20
          Private Const TOKEN_QUERY             As Long = 8&
          Private Const ERROR_NO_TOKEN         As Long = 1008&
       
       
       
       
      Private Type TOKEN_PRIVILEGES
          PrivilegeCount  As Long
          LuidLowPart     As Long
          LuidHighPart    As Long
          Attributes      As Long
      End Type
       
       
       
      Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueW" (ByVal lpSystemName As Long, ByVal lpName As Long, lpLuid As Long) As Long
      Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
      Private Declare Function OpenThreadToken Lib "advapi32.dll" (ByVal ThreadHandle As Long, ByVal DesiredAccess As Long, ByVal OpenAsSelf As Long, TokenHandle As Long) As Long
      Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, ByVal PreviousState As Long, ByVal ReturnLength As Long) As Long
      Private Declare Function GetCurrentThread Lib "kernel32.dll" () As Long
      Private Declare Function GetCurrentProcess Lib "kernel32.dll" () As Long
      Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
       
       
       
       
      Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
      Private Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, ByVal lpSecurityAttributes As Long, phkResult As Long, lpdwDisposition As Long) As Long
      Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
      Private Declare Function RegQueryValueExString Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As String, lpcbData As Long) As Long
      Private Declare Function RegQueryValueExLong Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Long, lpcbData As Long) As Long
      Private Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As Long, lpcbData As Long) As Long
      Private Declare Function RegSetValueExString Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpValue As String, ByVal cbData As Long) As Long
      Private Declare Function RegSetValueExLong Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpValue As Long, ByVal cbData As Long) As Long
       
         Private Function SetValueEx(ByVal hKey As Long, sValueName As String, lType As Long, vValue As Variant) As Long
            
             Dim lValue As Long
             Dim sValue As String
        
        
         Select Case lType
                
                 Case REG_SZ
                    
                     sValue = vValue & Chr$(0)
                     SetValueEx = RegSetValueExString(hKey, sValueName, 0&, lType, sValue, Len(sValue))
                
                 Case REG_DWORD
                
                     lValue = vValue
                     SetValueEx = RegSetValueExLong(hKey, sValueName, 0&, lType, lValue, 4)
                
                 End Select
                
                
         End Function
       
       
       
      Private Function SetCurrentProcessPrivileges(PrivilegeName As String) As Boolean
          
          Dim tp As TOKEN_PRIVILEGES, hToken&
          
          If LookupPrivilegeValue(0&, StrPtr(PrivilegeName), tp.LuidLowPart) Then   'i.e. "SeDebugPrivilege"
          
              If 0 = OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, 1&, hToken) Then
              
                  If Err.LastDllError = ERROR_NO_TOKEN Then
                  
                      If 0 = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hToken) Then
                          Exit Function
                      End If
                  Else
                      Exit Function
                  End If
              End If
       
              tp.PrivilegeCount = 1
              tp.Attributes = SE_PRIVILEGE_ENABLED
              SetCurrentProcessPrivileges = AdjustTokenPrivileges(hToken, 0&, tp, 0&, 0&, 0&)
              CloseHandle hToken
          End If
      End Function
       
       
       
       
       
      Private Sub SetKeyValue(sKeyName As String, sValueName As String, vValueSetting As Variant, lValueType As Long)
          
          Dim lRetVal As Long      'result of the SetValueEx function
          Dim hKey As Long         'handle of open key
       
          'open the specified key
          lRetVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE, sKeyName, 0, KEY_SET_VALUE, hKey)
          lRetVal = SetValueEx(hKey, sValueName, lValueType, vValueSetting)
          RegCloseKey (hKey)
          
      End Sub
       
       
       
      Private Sub Form_Load()
       
          SetCurrentProcessPrivileges "SeBackupPrivilege"
          SetCurrentProcessPrivileges "SeRestorePrivilege"
          SetCurrentProcessPrivileges "SeTakeOwnershipPrivilege"
          SetCurrentProcessPrivileges "SeSecurityPrivilege"       'SACL
       
       
          SetKeyValue "SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Capture\{877608b9-0609-4cf4-b714-3984ab0867c0}", "xxx", "Vasya", REG_SZ
       
       
      End Sub
      Параметр в реестре меняется сразу, немедленно.

      А вот чтобы он начал применяться - это вопросы к тому приложению/модулю, который использует значение из реестра. Если он при запуске прочитал и более не перечитывает - то вот хоть на пупе извернись, но без рестарта этого модуля новые значения не применить. А если приложение обращается к ОС, которая при своём старте либо при старте профиля прочитала и более не перечитывает - то не обойтись без рестарта того модуля ОС, который хранит прочитанное значение, при этом может потребоваться перевход профиля или даже рестарт всей ОС.
        Я хочу микрофон отключить через реестр.
        С помощью SetupAPI в диспетчере отключается, но всё равно работает.

        Добавлено
        Цитата Akina @
        Параметр в реестре меняется сразу, немедленно.

        а у меня не меняется!
        в чём-то ошибка, значит...
        я уже весь интернет пересмотрел, разные пробовал варианты, не работает...
          Цитата salieri @
          а у меня не меняется!

          А вот не верю. Полагаю, как-то не так проверяешь.
            Akina, захожу в реестр и смотрю
            а как ещё?
              Цитата salieri @
              захожу в реестр и смотрю

              Весьма расплывчато и неопределённо. Вот если бы "после программного изменения значения ключа запускаю regedit.exe и смотрю значение"...
                Цитата Akina @
                после программного изменения значения ключа запускаю regedit.exe и смотрю значение

                именно так и делаю!
                  А в какой именно Windows работаете с реестром?
                    Цитата PeterS @
                    А в какой именно Windows работаете с реестром?

                    WIN10 LTSC 1809 RUS x64
                      Цитата salieri @
                      Я хочу микрофон отключить через реестр.

                      Удаление гланд через анус. Так микрофон не отключают. Гугли в сторону https://docs.microsoft.com/en-us/windows/wi...ia/audio-mixers
                      Сообщение отредактировано: Gonarh -
                        Цитата Gonarh @

                        целый день сегодня просидел, как говорится, без бутылки не разобраться...
                        гораздо проще в реестре поменять
                        для моей задачи - это более чем достаточно
                        дело только в том, что раздел HKCU меняется без вопросов, а HKLM не получается изменить программно
                          Цитата salieri @
                          дело только в том, что раздел HKCU меняется без вопросов, а HKLM не получается изменить программно

                          Попробуй создать регфайл с изменением хклм, если при помощи него изменения вносятся, 100% не хватает прав.
                          Сообщение отредактировано: Gonarh -
                            Цитата Gonarh @
                            Попробуй создать регфайл с изменением хклм, если при помощи него изменения вносятся, 100% не хватает прав.

                            да, сделал, всё работает!
                            как с правами решить вопрос?
                              Цитата salieri @
                              как с правами решить вопрос?

                              Запускай свой софт от администратора. Маловероятно что получится, т.к. нужны права учётки под которой запущен System, если не ошибаюсь, но всё же.
                              Сообщение отредактировано: Gonarh -
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0391 ]   [ 16 queries used ]   [ Generated: 28.03.24, 09:13 GMT ]