在有些机器上(比例小), 设置了这个注册表值后, 需要重起才能生效. (大多数机器不需要).
直接使用gpedit.msc进行处理时, 又是即时生效的. 请问gpedit.msc还做了其他的什么处理吗?

解决方案 »

  1.   

    http://hi.baidu.com/feierinlove/blog/item/ac5b14811cae58dcbd3e1ee9.html
    修改注册表,比如修改光盘为不自动运行,如果单单通过写注册项修改NoDriveTypeAutorun属性,则要使其生效必须重起电脑,但是TweakUI就可以立即生效,到网上查发现必须先通知Windows外壳更新信息。最后去MSDN查了一下SendMessageTimeOut,觉得可以一试,结果还真成功了,呵呵下面是我修改系统 Policy 设置后实现立即生效的方法:SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,NULL,(LPARAM)(LPTSTR)lpD­ata,SMTO_NORMAL,1000,&dwResult);上面是 C 语言的 API 函数调用,用易语言就是:SendMessageTimeout (#HWND_BROADCAST, #WM_SETTINGCHANGE, 0, 0, #SMTO_NORMAL, 1000, dwResult).常量 HWND_BROADCAST, "65535"
    .常量 SMTO_NORMAL, "0"
    .常量 WM_SETTINGCHANGE, "26".DLL命令 SendMessageTimeout, 整数型, "user32", "SendMessageTimeoutA", ,
         .参数 hWnd, 整数型, , 要接收消息的一个窗口的句柄
         .参数 Msg, 整数型, , 消息的标识符
         .参数 wParam, 整数型, , 由消息决定
         .参数 lParam, 整数型, , 由消息决定
         .参数 fuFlags, 整数型, , 下述常数的一个或多个;SMTO_ABORTIFHUNG:如目标进程挂起,则函数立即返回;SMTO_BLOCK:除非函数返回,否则调用线程不能处理消息;SMTO_NORMAL:允许调用线程处理消息,同时保持函数继续执行
         .参数 uTimeout, 整数型, , 超时值,采用毫秒为单位
         .参数 lpdwResult, 整数型, 传址, 用于装载函数结果的一个变量;这个API函数可以帮你通知底层应用程序更新注册表中 Policies 和 Enviroment 相关的所有注册项。AU3都会吧。AU3也一样可以用。嘿嘿。#NoTrayIcon
    RegWrite("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced","StartMenuChange","REG_DWORD","0")
    RegWrite("HKLM\SYSTEM\CurrentControlSet\Control\CrashControl","AutoReboot","REG_DWORD","1")
    DllCall("user32.dll","int","SendMessageTimeout","hwnd",65535,"int",26,"int",0,"int",0,"int",0,"int",1000,"str","dwResult")
    (这句关键。哈哈)Exit
      

  2.   

    ls说的是一种方法,我这边再说一种在你的程序修改注册表的代码段的后面,RegClose后面加上一句:   
      SystemParametersInfo(SPI_SETCURSORS,0,NULL,SPIF_SENDCHANGE);             
    就可以了