VBcoders Guest



Don't have an account yet? Register
 


Forgot Password?



Change regional options in Control Panel ( decimal, thousand, short date, etc )

by Gabio (9 Submissions)
Category: Windows API Call/Explanation
Compatability: VB 6.0
Difficulty: Unknown Difficulty
Originally Published: Sat 25th January 2003
Date Added: Mon 8th February 2021
Rating: (1 Votes)

Change regional options in Control Panel ( decimal, thousand, short date, etc )

Rate Change regional options in Control Panel ( decimal, thousand, short date, etc )



Option Explicit
Public blnMDSettingsChanged As Boolean

Private Declare Function GetUserDefaultLCID Lib "kernel32" () As Long
Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long
Private Declare Function GetThreadLocale Lib "kernel32" () As Long

Private Declare Function GetLocaleInfo Lib "kernel32" _
   Alias "GetLocaleInfoA" _
  (ByVal Locale As Long, _
   ByVal LCType As Long, _
   ByVal lpLCData As String, _
   ByVal cchData As Long) As Long

Private Declare Function SetLocaleInfo Lib "kernel32" _
    Alias "SetLocaleInfoA" _
   (ByVal Locale As Long, _
    ByVal LCType As Long, _
    ByVal lpLCData As String) As Long

Private Const HWND_BROADCAST As Long = &HFFFF&
Private Const WM_SETTINGCHANGE As Long = &H1A

Private Declare Function PostMessage Lib "user32" _
   Alias "PostMessageA" _
  (ByVal hwnd As Long, _
   ByVal wMsg As Long, _
   ByVal wParam As Long, _
   lParam As Any) As Long
Const LOCALE_SDECIMAL As Long = &HE        'decimal separator
Const LOCALE_STHOUSAND = &HF  'thousand separator
Const LOCALE_SSHORTDATE = &H1F 'short date
Const LOCALE_SCURRENCY = &H14 'currency symbol
Const LOCALE_SMONDECIMALSEP = &H16 ' 'decimal separator for currency
Const LOCALE_SMONTHOUSANDSEP = &H17 'thousand separator for currency

Private old_LOCALE_SDECIMAL As String
Private old_LOCALE_STHOUSAND As String
Private old_LOCALE_SSHORTDATE As String
Private old_LOCALE_SMONTHOUSANDSEP As String
Private old_LOCALE_SMONDECIMALSEP As String
Private old_LOCALE_SCURRENCY As String

Dim LCID As Long, iRet As Long, lpLCDataVar As String, Symbol As String
Dim iRet2 As Long, pos As Integer
    
Public Sub setMDSettings()
    
    blnMDSettingsChanged = False
' read currency symbol
    LCID = GetUserDefaultLCID()
    iRet = GetLocaleInfo(LCID, LOCALE_SCURRENCY, lpLCDataVar, 0)
    Symbol = String$(iRet, 0)
    iRet2 = GetLocaleInfo(LCID, LOCALE_SCURRENCY, Symbol, iRet)
    pos = InStr(Symbol, Chr$(0))
    If pos > 0 Then
        Symbol = Left$(Symbol, pos - 1)
    End If
    If Symbol <> " " Then
        'change currency symbol
        blnMDSettingsChanged = True
        old_LOCALE_SCURRENCY = Symbol
        LCID = GetUserDefaultLCID()
        Call SetLocaleInfo(LCID, LOCALE_SCURRENCY, " ")
        Call PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0&, ByVal 0&)
    End If
    
' read decimal separator
    LCID = GetUserDefaultLCID()
    iRet = GetLocaleInfo(LCID, LOCALE_SDECIMAL, lpLCDataVar, 0)
    Symbol = String$(iRet, 0)
    iRet2 = GetLocaleInfo(LCID, LOCALE_SDECIMAL, Symbol, iRet)
    pos = InStr(Symbol, Chr$(0))
    If pos > 0 Then
        Symbol = Left$(Symbol, pos - 1)
    End If
    If Symbol <> "." Then
        'change decimal separator
        blnMDSettingsChanged = True
        old_LOCALE_SDECIMAL = Symbol
        LCID = GetUserDefaultLCID()
        Call SetLocaleInfo(LCID, LOCALE_SDECIMAL, ".")
        Call PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0&, ByVal 0&)
    End If

' read thousand separator
    LCID = GetUserDefaultLCID()
    iRet = GetLocaleInfo(LCID, LOCALE_STHOUSAND, lpLCDataVar, 0)
    Symbol = String$(iRet, 0)
    iRet2 = GetLocaleInfo(LCID, LOCALE_STHOUSAND, Symbol, iRet)
    pos = InStr(Symbol, Chr$(0))
    If pos > 0 Then
        Symbol = Left$(Symbol, pos - 1)
    End If
    
    If Symbol <> "," Then
        'change thousand separator
        blnMDSettingsChanged = True
        old_LOCALE_STHOUSAND = Symbol
        LCID = GetUserDefaultLCID()
        Call SetLocaleInfo(LCID, LOCALE_STHOUSAND, ",")
        Call PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0&, ByVal 0&)
    End If
    
' read decimal separator for currency
    LCID = GetUserDefaultLCID()
    iRet = GetLocaleInfo(LCID, LOCALE_SMONDECIMALSEP, lpLCDataVar, 0)
    Symbol = String$(iRet, 0)
    iRet2 = GetLocaleInfo(LCID, LOCALE_SMONDECIMALSEP, Symbol, iRet)
    pos = InStr(Symbol, Chr$(0))
    If pos > 0 Then
        Symbol = Left$(Symbol, pos - 1)
    End If
    If Symbol <> "." Then
        'change decimal separator for currency
        blnMDSettingsChanged = True
        old_LOCALE_SMONDECIMALSEP = Symbol
        LCID = GetUserDefaultLCID()
        Call SetLocaleInfo(LCID, LOCALE_SMONDECIMALSEP, ".")
        Call PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0&, ByVal 0&)
    End If
    
    
    
' read thousand separator for currency
    LCID = GetUserDefaultLCID()
    iRet = GetLocaleInfo(LCID, LOCALE_SMONTHOUSANDSEP, lpLCDataVar, 0)
    Symbol = String$(iRet, 0)
    iRet2 = GetLocaleInfo(LCID, LOCALE_SMONTHOUSANDSEP, Symbol, iRet)
    pos = InStr(Symbol, Chr$(0))
    If pos > 0 Then
        Symbol = Left$(Symbol, pos - 1)
    End If
    
    If Symbol <> "," Then
        'change thousand separator
        blnMDSettingsChanged = True
        old_LOCALE_SMONTHOUSANDSEP = Symbol
        LCID = GetUserDefaultLCID()
        Call SetLocaleInfo(LCID, LOCALE_SMONTHOUSANDSEP, ",")
        Call PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0&, ByVal 0&)
    End If
' read short date
    LCID = GetUserDefaultLCID()
    iRet = GetLocaleInfo(LCID, LOCALE_SSHORTDATE, lpLCDataVar, 0)
    Symbol = String$(iRet, 0)
    iRet2 = GetLocaleInfo(LCID, LOCALE_SSHORTDATE, Symbol, iRet)
    pos = InStr(Symbol, Chr$(0))
    If pos > 0 Then
        Symbol = Left$(Symbol, pos - 1)
    End If
    
    If Symbol <> "MM/dd/yyyy" Then
        'change thousand separator
        blnMDSettingsChanged = True
        old_LOCALE_SSHORTDATE = Symbol
        LCID = GetUserDefaultLCID()
        Call SetLocaleInfo(LCID, LOCALE_SSHORTDATE, "MM/dd/yyyy")
        Call PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0&, ByVal 0&)
    End If
End Sub
Public Sub restoreSettings()
'restore the original settings in cp
    If old_LOCALE_SCURRENCY <> vbNullString Then
    ' restore currency symbol
        LCID = GetUserDefaultLCID()
        Call SetLocaleInfo(LCID, LOCALE_SCURRENCY, old_LOCALE_SCURRENCY)
        Call PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0&, ByVal 0&)
    End If
    
    If old_LOCALE_SDECIMAL <> vbNullString Then
    ' restore decimal symbols
        LCID = GetUserDefaultLCID()
        Call SetLocaleInfo(LCID, LOCALE_SDECIMAL, old_LOCALE_SDECIMAL)
        Call PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0&, ByVal 0&)
    End If
    If old_LOCALE_STHOUSAND <> vbNullString Then
    ' restore thousand separator
        LCID = GetUserDefaultLCID()
        Call SetLocaleInfo(LCID, LOCALE_STHOUSAND, old_LOCALE_STHOUSAND)
        Call PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0&, ByVal 0&)
    End If
    If old_LOCALE_SMONDECIMALSEP <> vbNullString Then
    ' restore decimal separator for currency
        LCID = GetUserDefaultLCID()
        Call SetLocaleInfo(LCID, LOCALE_SMONDECIMALSEP, old_LOCALE_SMONDECIMALSEP)
        Call PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0&, ByVal 0&)
    End If
    If old_LOCALE_SMONTHOUSANDSEP <> vbNullString Then
    ' restore thousand separator for currency
        LCID = GetUserDefaultLCID()
        Call SetLocaleInfo(LCID, LOCALE_SMONTHOUSANDSEP, old_LOCALE_SMONTHOUSANDSEP)
        Call PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0&, ByVal 0&)
    End If
    
    If old_LOCALE_SSHORTDATE <> vbNullString Then
    ' restore short date
        LCID = GetUserDefaultLCID()
        Call SetLocaleInfo(LCID, LOCALE_SSHORTDATE, old_LOCALE_SSHORTDATE)
        Call PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0&, ByVal 0&)
    End If
End Sub








Download this snippet    Add to My Saved Code

Change regional options in Control Panel ( decimal, thousand, short date, etc ) Comments

No comments have been posted about Change regional options in Control Panel ( decimal, thousand, short date, etc ). Why not be the first to post a comment about Change regional options in Control Panel ( decimal, thousand, short date, etc ).

Post your comment

Subject:
Message:
0/1000 characters