Перезагружать переменные среды без перезапуска Excel? - PullRequest
0 голосов
/ 15 января 2019

Я использую функцию Environ() для получения переменных среды из запущенного экземпляра Excel. Когда в системе определена новая переменная, Excel не узнает ее, пока не перезапустится.

Мой вопрос: Есть ли способ получить новое значение переменных среды без необходимости перезапуска Excel?

Контрольный пример:

  • Поиск Windows / Система / Расширенные настройки системы / Переменные среды
  • Открыть Microsoft Excel
  • Определить новую пользовательскую переменную, скажем TESTING, со значением Whatever

enter image description here

  • Запустите следующий макрос:

    Sub test()
    
        MsgBox "TESTING:" & Environ("TESTING")
    
    End Sub
    

... переменная пуста:

enter image description here

  • Перезагрузите Microsoft Excel
  • Повторно запустите тот же макрос еще раз: переменная загружена.

enter image description here

Ответы [ 2 ]

0 голосов
/ 15 января 2019
Sub Test()

    MsgBox CreateObject("WScript.Shell").Environment("system").Item("testing")

End Sub
0 голосов
/ 15 января 2019

Вам нужно создать подкласс своего окна Excel и перехватывать wm_settingchange сообщения, которые отправляются из окружения панели управления и setx.

Это VB.Net - lparam содержит указатель на строку, говорящую Environment. Вам решать, что изменилось.

Console.writeline(Marshal.PtrToStringUni(lparam))

Вернуться к VB6 / VBA

Вот некоторый код, который перехватывает и отцепляет и winproc. Вы получаете hWnd в Excel из свойства excel.application hWnd.

Public Sub Hook()
   lpPrevWndProc = SetWindowLong(EditNote.gRtfHwnd, GWL_WNDPROC, _
   AddressOf gWindowProc)
End Sub

Public Sub Unhook()
   Dim temp As Long
   temp = SetWindowLong(EditNote.gRtfHwnd, GWL_WNDPROC, lpPrevWndProc)
End Sub

Public Function gWindowProc(ByVal hwnd As Long, ByVal Msg As Long, _
                 ByVal wParam As Long, ByVal lParam As Long) As Long
   If Msg = WM_CONTEXTMENU Then
        If EditNote.mnuViewEditContextMenu.Checked Then EditNote.PopupMenu EditNote.mnuEdit
'        gWindowProc = CallWindowProc(lpPrevWndProc, hWnd, Msg, wParam, _
         lParam)
   Else ' Send all other messages to the default message handler
      gWindowProc = CallWindowProc(lpPrevWndProc, hwnd, Msg, wParam, _
         lParam)
   End If
End Function

Каждое приложение получает копию блока памяти своего родительского окружения. Программа не может получить доступ к памяти другой программы - так что это один из способов. Только Windows Explorer слушает это сообщение. Таким образом, обновленная переменная доступна только в проводнике Windows и любой новой программе, запущенной проводником. Примечание: CMD не слушает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...