2014-11-16 32 views
2

我需要創建沒有默認值使用AutoHotkey的一個新的註冊表鍵的默認值(不爲空)一個Windows註冊表項。創建使用AutoHotkey的

瑣碎的解決方案應該是:

RegWrite, REG_SZ, HKCU, Environment\testkey 

離開值名稱和值字段爲空。不幸的是,這產生了testkey空白默認值,即一個空字符串,這不是我想要的。 我想要一個默認值undefined內容,也就是當我在RegEdit中創建一個新密鑰時發生的相同情況(抱歉,由於缺乏術語,我有一個意大利本地化的操作系統,所以我不知道如何「不」設置「值以英文語言環境顯示)。

我發現了一個解決辦法,這僅僅是與創建後刪除默認值:

RegWrite, REG_SZ, HKCU, Environment\testkey 
RegDelete, HKCU, Environment\testkey, AHK_DEFAULT 

,但它似乎是一個骯髒的黑客,也許如果我不得不創造出許多這樣的鍵會影響性能。

是否有更簡潔的方式來實現相同的目標(也許某種方式強制RegWrite不創建空白默認值,而只是創建密鑰)?

+0

也許我應該提到,我需要一個適用於WindowsXP和Windows7的解決方案,雖然這些信息可能並不相關。 –

回答

3

Autohotkeys內置的regwrite按照你所說的做,似乎不支持空白鍵。

我做了一個小測試,這裏是東西給你嘗試

如果離開ValueName的空白子項的默認值時,如果S值省略空白/零值被使用。

#SingleInstance force 
RegWrite("REG_SZ","HKCU","Environment\testkey","","") 
return 

RegWrite(Type, RKey, SKey, ValueName="",sValue="") 
{ 
    HKCR := HKEY_CLASSES_ROOT := 0x80000000 ; http://msdn.microsoft.com/en-us/library/aa393286.aspx 
    HKCU := HKEY_CURRENT_USER := 0x80000001 
    HKLM := HKEY_LOCAL_MACHINE := 0x80000002 
    HKU  := HKEY_USERS   := 0x80000003 
    HKCC := HKEY_CURRENT_CONFIG := 0x80000005 
    HKDD := HKEY_DYN_DATA  := 0x80000006 
    REG_NONE    := 0     ; http://msdn.microsoft.com/en-us/library/ms724884.aspx 
    REG_SZ     := 1 
    REG_EXPAND_SZ   := 2 
    REG_BINARY    := 3 
    REG_DW := REG_DWORD  := 4 
    REG_DWORD_BIG_ENDIAN := 5 
    REG_LINK    := 6 
    REG_MULTI_SZ   := 7 
    REG_RESOURCE_LIST  := 8 

    if !(RKey := %RKey%)       ; Dynamicaly assign the RootKey 
     Return false        ; A invalid rootkey was givven 
    if !(Type := %Type%)       ; Dynamicaly assign the DataType 
     Return false        ; A invalid Type was givven 
    if DllCall("Advapi32.dll\RegCreateKeyEx","uint", RKey, "Str", SKey, "uint", 0 , "uint", 0 , "uint", 0, "uint",0xF003F, "uint", 0 , "uint *", hKey) { ; create the key 
     Return false        ; Error creating or opening the key 
     }  
    If (Type == REG_SZ or Type == REG_EXPAND_SZ) 
       DllCall("Advapi32.dll\RegSetValueEx", "uint", hKey, "str", ValueName, "uint", 0, "uint", Type, "str", sValue, "uint", DataSize := (StrLen(sValue) + 1)*2) ; write string 
    else If (Type == REG_BINARY) { 
     size:=StrLen(sValue)//2      ; set the data to half, one byte=2 hex digits 
     VarSetCapacity(Rbin, size,0)     ; set the capacity 
     loop,% size { 
     StringLeft, bin, sValue,2     ; get the left 2digits at the time 
     NumPut("0x" Bin,Rbin,A_Index-1,"Char")  ; Store the data 
     StringTrimLeft, sValue, sValue, 2   ; remove the to digits 
     } 
     DllCall("Advapi32.dll\RegSetValueEx","uint",hKey,"str",ValueName,"uint",0,"uint",Type,Uint,&Rbin,"uint",size) ; write string 
    } Else If (Type == REG_DWORD) { 
     VarSetCapacity(RDW, 4,0)     ; setthe capacity to 4 bytes 
     NumPut(sValue,RDW,0)      ; Store the data in itData 
     DllCall("Advapi32.dll\RegSetValueEx","uint",hKey,"str",ValueName,"uint",0,"uint",Type,"uint",&RDW,"uint",4) ; write dword ; a DWORD is a 32-bit (4 byte) number 
     ; RDW := "" ; clear the variable 
     } 
     DllCall("Advapi32.dll\RegCloseKey", "uint", hKey) ; Release the handle of the key 
    return, true 
} 

我就贏7 64位用AHK 1.1.16.05 32位的unicode從http://ahkscript.org

這工作在我的測試ATLEAST什麼,我認爲你正在嘗試做的。

+0

+1爲真正的努力,但我不會接受它,因爲它真的不回答我的問題。儘管這是一個解決方案,但我要求一個比我更清潔的***解決方案(可能更有效)。你使用'DllCall'調用Win32 API,從我的POV和用例來看,這比調用'RegDelete'更像一個黑客。此外,我擔心它的性能可能會更糟糕,因爲它涉及到所有的嘲諷'DllCall'確實構建了一個合適的堆棧框架來調用底層的C API函數(您的解決方案涉及三個沉重的'DllCall's而不僅僅是我的兩個「常規「函數調用)。 –

+0

好吧!但使用dllcall絕不是駭人聽聞的,它與使用內置函數一樣,只是更多的控制。而且我不能說dllcalls是否重載了函數調用,因爲我沒有在C++源代碼中查找它們,但我真的懷疑它。 – blackholyman

+0

嗯我只是看了起來,同樣的3來電在這裏看到你的自我https://github.com/Lexikos/AutoHotkey_L/blob/master/source/script_registry.cpp#L353 – blackholyman