Вам нужно создать подкласс своего окна 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 не слушает это.