2013-09-03 2 views
2

시스템 환경 변수를 설정하려고합니다. 반영 될 변경 사항에 대해 메모합니다. 창을 업데이트하기 위해 SendMessageTimeout을 수행해야합니다.C# 환경 변수 업데이트 - SendMessageTimeout

실행할 수 있고 결과는 0이지만 환경 변수는 실제로 업데이트되지 않습니다.

[Flags] 
public enum SendMessageTimeoutFlags : uint 
{ 
    SMTO_NORMAL = 0x0, 
    SMTO_BLOCK = 0x1, 
    SMTO_ABORTIFHUNG = 0x2, 
    SMTO_NOTIMEOUTIFNOTHUNG = 0x8 
} 

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
public static extern IntPtr SendMessageTimeout(
IntPtr hWnd, 
uint Msg, 
UIntPtr wParam, 
IntPtr lParam, 
SendMessageTimeoutFlags fuFlags, 
uint uTimeout, 
out UIntPtr lpdwResult); 


string reg_subkey = "Test1"; 
string reg_name = @"HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment"; 
Registry.SetValue(reg_name, reg_subkey, "testing", RegistryValueKind.String); 

IntPtr HWND_BROADCAST = new IntPtr(0xffff); 
const uint WM_WININICHANGE = 0x001A; 
const uint WM_SETTINGCHANGE = WM_WININICHANGE; 
const int MSG_TIMEOUT = 15000; 
UIntPtr RESULT; 

string ENVIRONMENT = "Environment"; 

SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, UIntPtr.Zero, (IntPtr)Marshal.StringToHGlobalAnsi(ENVIRONMENT), SendMessageTimeoutFlags.SMTO_ABORTIFHUNG, MSG_TIMEOUT, out RESULT); 

답변

4

가장 쉬운 방법은 Environment.SetEnvironmentVariable입니다. 내부적으로 SendMessageTimeout이 호출됩니다.

+0

네, 훨씬 간단한 방법입니다. –

1

함수 다음에 SendMessageTimeout을 사용하려고했는데, 이것은 내 팀에서 컴퓨터 컨텍스트의 PATH 변수를 업데이트하여 테스트했습니다. 또한 문서의 반대로 Environment.SetEnvironmentVariable은 새로운 변수를 생성 할 때만 작동한다는 것을 알았습니다. 부모 프로세스가 업데이트 된 PATH 변수를 가져와야하는 시나리오에서 테스트하고 있습니다.