應用程序修改系統環境變量後如何刷新?

在手動去系統環境變量頁面增加新路徑後,確定後會自動刷新系統環境變量,但是當我們的程序通過API修改後,如果不做一些處理,系統還是舊的環境,通過cmd去訪問是找不到的。

首先系統環境變量對應註冊表是HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment(需要管理器權限),通過RegSetValue 等函數修改後,如向path新增加了微信的路徑,此時在CMD中執行WeChat是無效的,必須重啓才生效,或者進入以下界面,依次確定後纔會生效。
在這裏插入圖片描述
解決辦法是使用SendMessageTimeout函數廣播一條消息。
SendMessageTimeout使用非常簡單:參數如下:

hWnd:接收消息的窗口的句柄。如果爲HWND_BROADCAST,則消息會被髮送到系統中所有頂層窗口,包括無效或不可見的窗口。
Msg:指定被髮送的消息。
wParam:指定附加的信息。
IParam:指定附加的信息。
fuFlags:指定如何發送消息。此參數可爲下列值的組合:
SMTO_ABORTIFHUNG:如果接收線程沒有響應或掛起,則函數將返回,而無需等待超時時間過去。
SMTO_BLOCK:阻止調用線程處理其他任何請求,直到函數返回爲止。
SMTO_NORMAL:在等待函數返回時,不會阻止調用線程處理其他請求。
SMTO_NOTIMEOUTIFNOTHUNG:只要接收線程正在處理消息,該函數就不會強制執行超時期限。
SMTO_ERRORONEXIT:如果在處理消息時接收窗口被破壞或它自己的線程死亡,則該函數應返回0。
uTimeout:超時時間,當最多15秒的時間.
lpdwResult消息處理的結果。

根據上面參數,首先hWnd要設置爲HWND_BROADCAST,Msg爲WM_SETTINGCHANGE,MSDN對WM_SETTINGCHANGE的解釋是,更改系統或用戶的環境變量,要將lParam設置爲字符串"Environment",wParam可以爲0,詳細可以查看https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-settingchange頁面。

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern long SendMessageTimeout(IntPtr windowHandle, uint Msg,IntPtr wParam, string lParam, uint flags, uint timeout, out long result);

public static void RefreshEnvironment() {
      long result;
      SendMessageTimeout(new IntPtr(HWND_BROADCAST), WM_SETTINGCHANGE, IntPtr.Zero,
          "Environment", SMTO_ABORTIFHUNG, 5000, out result);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章