you are welcome...
you can do this very easy...
Code: Select all
Global RegLastMessage.s
Procedure.s FormatMessage(ErrorNumber.l)
Protected *Buffer, len, result.s
len = FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM,0,ErrorNumber,0,@*Buffer,0,0)
If len
result = PeekS(*Buffer, len - 2)
LocalFree_(*Buffer)
ProcedureReturn result
Else
ProcedureReturn "Errorcode: " + Hex(ErrorNumber)
EndIf
EndProcedure
Procedure.s Reg_ListSubKey(topKey, sKeyName.s, Index, ComputerName.s = "")
Protected hKey.l, lhRemoteRegistry.l
Protected r1.l, Result.l
Protected lpName.s{256}, ListSubKey.s
Protected lpcbName.l
Protected lpftLastWriteTime.FILETIME
RegLastError = 0
If Left(sKeyName, 1) = "\" : sKeyName = Right(sKeyName, Len(sKeyName) - 1) : EndIf
If Right(sKeyName,1)="\" : sKeyName = Left(sKeyName, Len(sKeyName) - 1) : EndIf
If ComputerName = ""
r1 = RegOpenKeyEx_(topKey, sKeyName, 0, #KEY_ALL_ACCESS, @hKey)
Else
r1 = RegConnectRegistry_(ComputerName, topKey, @lhRemoteRegistry)
If r1 <> #ERROR_SUCCESS
RegLastError = r1
RegLastMessage = FormatMessage(RegLastError)
ProcedureReturn ""
EndIf
r1 = RegOpenKeyEx_(lhRemoteRegistry, sKeyName, 0, #KEY_ALL_ACCESS, @hKey)
EndIf
If r1 = #ERROR_SUCCESS
lpcbName = 255
r1 = RegEnumKeyEx_(hKey, Index, @lpName, @lpcbName, 0, 0, 0, @lpftLastWriteTime)
If r1 = #ERROR_SUCCESS
ListSubKey.s = Left(lpName, lpcbName)
Else
RegLastError = r1
RegLastMessage = FormatMessage(RegLastError)
ListSubKey.s = ""
EndIf
Else
RegLastError = r1
RegLastMessage = FormatMessage(RegLastError)
ListSubKey.s = ""
EndIf
; Close Key
RegCloseKey_(hKey)
; Close Remote
If lhRemoteRegistry
RegCloseKey_(lhRemoteRegistry)
EndIf
ProcedureReturn ListSubKey
EndProcedure
Procedure.s Reg_GetValue(topKey, sKeyName.s, sValueName.s, ComputerName.s = "")
Protected hKey.l, lhRemoteRegistry.l
Protected r1.l, Result.l
Protected lpData.s{256}, GetValue.s
Protected lType.l, lpcbData.l, lpDataDWORD.l
RegLastError = 0
GetValue.s = ""
If Left(sKeyName, 1) = "\" : sKeyName = Right(sKeyName, Len(sKeyName) - 1) : EndIf
If Right(sKeyName,1)="\" : sKeyName = Left(sKeyName, Len(sKeyName) - 1) : EndIf
If ComputerName = ""
r1 = RegOpenKeyEx_(topKey, sKeyName, 0, #KEY_ALL_ACCESS, @hKey)
Else
r1 = RegConnectRegistry_(ComputerName, topKey, @lhRemoteRegistry)
If r1 <> #ERROR_SUCCESS
RegLastError = r1
RegLastMessage = FormatMessage(RegLastError)
ProcedureReturn ""
EndIf
r1 = RegOpenKeyEx_(lhRemoteRegistry, sKeyName, 0, #KEY_ALL_ACCESS, @hKey)
EndIf
If r1 = #ERROR_SUCCESS
lpcbData = 255
r1 = RegQueryValueEx_(hKey, sValueName, 0, @lType, @lpData, @lpcbData)
If r1 = #ERROR_SUCCESS
Select lType
Case #REG_SZ
r1 = RegQueryValueEx_(hKey, sValueName, 0, @lType, @lpData, @lpcbData)
If r1 = #ERROR_SUCCESS
GetValue = Left(lpData, lpcbData - 1)
Else
GetValue = ""
EndIf
Case #REG_DWORD
r1 = RegQueryValueEx_(hKey, sValueName, 0, @lType, @lpDataDWORD, @lpcbData)
If r1 = #ERROR_SUCCESS
GetValue = Str(lpDataDWORD)
Else
GetValue = ""
EndIf
EndSelect
If r1 = #ERROR_SUCCESS
Result = #True
Else
RegLastError = r1
RegLastMessage = FormatMessage(RegLastError)
Result = #False
EndIf
Else
RegLastError = r1
RegLastMessage = FormatMessage(RegLastError)
EndIf
Else
RegLastError = r1
RegLastMessage = FormatMessage(RegLastError)
EndIf
; Close Key
RegCloseKey_(hKey)
; Close Remote
If lhRemoteRegistry
RegCloseKey_(lhRemoteRegistry)
EndIf
ProcedureReturn GetValue
EndProcedure
Define nn, res.s, res2.s
Debug "start "
For nn = 0 To 100 ; I don't know how many keys we will find ... so we check on empty string
res = Reg_ListSubKey(#HKEY_CURRENT_USER, "Control Panel\NotifyIconSettings", nn)
If res
Debug " -> " + res
res2 = Reg_GetValue(#HKEY_CURRENT_USER, "Control Panel\NotifyIconSettings\" + res, "ExecutablePath")
If res2 And res2 = ProgramFilename() ; <-- this value only exists if you have previously executed a program with AddSysTrayIcon()
res2 = Reg_GetValue(#HKEY_CURRENT_USER, "Control Panel\NotifyIconSettings\" + res, "IsPromoted")
Debug " ----> IsPromoted == " + res2
EndIf
Else
Debug "escape the loop, no more keys."
Break
EndIf
Next nn
Debug "done"