Немедленно применить изменения реестра - PullRequest
0 голосов
/ 08 ноября 2018

Я использую сценарий PowerShell для изменения значения HKEY_CURRENT_USER\Software\Microsoft\Wisp\Touch\TouchMode_hold. После изменения я хотел бы применить эти изменения немедленно, поэтому после того, как я отправляю сообщение WM_SETTINGCHANGE, но после этого ничего не изменилось (если touchmode_hold был включен, то он все еще включен). Функция, которую я использую для отправки этого сообщения:

function Update-Explorer {
    [CmdletBinding()]
    Param()

    $code = @'
private static readonly IntPtr HWND_BROADCAST = new IntPtr(0xffff); 
private const int WM_SETTINGCHANGE = 0x1a; 
private const int SMTO_ABORTIFHUNG = 0x0002; 

[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
static extern bool SendNotifyMessage(IntPtr hWnd, uint Msg, UIntPtr wParam, IntPtr lParam);

[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)] 
private static extern IntPtr SendMessageTimeout ( IntPtr hWnd, int Msg, IntPtr wParam, string lParam, uint fuFlags, uint uTimeout, IntPtr lpdwResult ); 

[System.Runtime.InteropServices.DllImport("Shell32.dll")] 
private static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2);

public static void Refresh() {
    SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero);
    SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, null, SMTO_ABORTIFHUNG, 3000, IntPtr.Zero); 
}
'@

    Add-Type -MemberDefinition $code -Namespace MyWinAPI -Name Explorer 
    [MyWinAPI.Explorer]::Refresh()
}

Кто-нибудь знает, как сообщить Windows, что этот реестр был изменен?

...