我使用函数Environ()
从正在运行的Excel实例中获取环境变量。
在系统中定义新变量后,Excel直到重新启动它才知道它。
我的问题是:有什么方法可以获取环境变量的新值而无需重新启动Excel?
测试用例是:
TESTING
定义一个新的用户变量,例如Whatever
运行以下宏:
Sub test()
MsgBox "TESTING:" & Environ("TESTING")
End Sub
...变量为空:
答案 0 :(得分:4)
Sub Test()
MsgBox CreateObject("WScript.Shell").Environment("system").Item("testing")
End Sub
答案 1 :(得分:2)
您需要继承excel窗口的子类,并拦截从控制面板环境事物和wm_settingchange
发送的setx
消息。
这是VB.Net-lparam包含一个指向Environment
的字符串的指针。由您决定发生了什么变化。
Console.writeline(Marshal.PtrToStringUni(lparam))
返回VB6 / VBA
这里有一些钩子,钩子和winproc的代码。您可以从excel.application
hWnd
属性中获取Excel的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资源管理器侦听此消息。因此,更新的变量仅在Windows资源管理器和资源管理器启动的任何新程序中可用。注意:CMD不会监听。