WIN API-VFP更改Windows的区域选项:(长)日期格式(分隔符),时间格式(分隔符)[参考:控制面板-区域和语言选项-区域选项]

时间:2023-01-20 16:40:06
*!* 其实在VFP中,此方法可以说是多余的,因为VFP本身的命令SET DATE .../SET CENTURY .../Time()等
*!* 即可完成程序内的转换及使用,可是个别开发工具转换起来并不轻易,甚至有些软件让用户手动改控制面板中设置。
*!* 为了不让用户手动更改,所以找了找API函数,写成在VFP中实现对区域选项的更改。
 

*----------------------------------------------------------------------------------
*--函  数:MySetLocalInfo(tcOption,tcChangeString)
*--参数 1:不区分大小写
*     tcOption:LongDateFormat    ->更改长日期格式
*             :ShortDateFormat   ->更改短日期格式
*             :DateSeparator     ->更改日期分隔符
*             :TimeFormat        ->更改时间格式
*             :TimeSeparator     ->更改时间分隔符
*--参数 2:区分大小写
*     tcChangeString:            ->字符串,如tcOption为DateSeparator时此处可为"-"
*--返回值:成功近回.T.,失败近回.F.
*--作  者:十豆三
*--日  期:2008/04/29
*----------------------------------------------------------------------------------
 

*--调用示例:
?MySetLocalInfo("LongDateFormat","yyyy'年'MM'月'dd'日'") 
&&更改长日期格式
?MySetLocalInfo("ShortDateFormat","yyyy-MM-dd")        
 &&更改短日期格式
?MySetLocalInfo("DateSeparator","-")
                    &&更改日期分隔符
?MySetLocalInfo("TimeFormat","HH:mm:ss")
                &&更改时间格式
?MySetLocalInfo("TimeSeparator",":")                     &&更改时间分隔符


Function MySetLocalInfo
    Parameters
tcOption,tcChangeString
   
If Parameters()<>2 Or Empty(tcOption) Or Empty
(tcChangeString)
       
Return
.F.
   
Endif
    Private
lnLocal,lpBuffer,lnRetVal
    tcOption=
Upper(tcOption)


    #
Define LOCALE_SSHORTDATE 0x1F        &&short date format string
   
#Define LOCALE_SDATE 0x1D
            &&date separator
   
#Define LOCALE_SLONGDATE 0x20        
&&long date format string
   
#Define LOCALE_STIMEFORMAT 0x1003
    &&time format string
   
#Define LOCALE_STIME 0x1E
            &&time separator
   
#Define
HWND_BROADCAST 0xFFFF
    #
Define
WM_WININICHANGE 0x1A
    #
Define
SPI_SETDESKWALLPAPER 20
    #
Define SPIF_SENDCHANGE 0x2


    Declare Integer GetUserDefaultLCID In kernel32
   
Declare Integer GetLocaleInfo In kernel32 Integer Locale,Integer LCType,String lpLCData,Integer
cchData
   
Declare Integer SetLocaleInfo In kernel32 Integer Locale,Integer LCType,String
lpLCData
   
Declare Integer SendMessage In win32api Integer HWnd,Integer Msg,String wParam,String
IParam
   
Declare Integer SystemParametersInfo In "user32" Integer uiAction,Integer uiParam,Integer pvParam,Integer
fWinlni
 

    Do Case
        Case
tcOption=Upper("LongDateFormat")
     &&更改长日期格式
           
lnBufferLen=50
            lnType=LOCALE_SLONGDATE
       
Case tcOption=Upper("ShortDateFormat")
    &&更改短日期格式,包括日期分隔符
           
lnBufferLen=20
            lnType=LOCALE_SSHORTDATE
       
Case tcOption=Upper("DateSeparator")
      &&更改日期分隔符,不改变日期格式
           
lnBufferLen=2
            lnType=LOCALE_SDATE
       
Case tcOption=Upper("TimeFormat")
         &&更改时间格式,包括时间分隔符
           
lnBufferLen=20
            lnType=LOCALE_STIMEFORMAT
       
Case tcOption=Upper("TimeSeparator")
      &&更改时间分隔符,不改变时间格式
           
lnBufferLen=2
            lnType=LOCALE_STIME
       
Otherwise
            Return
.F.
   
Endcase
    lnLocal=GetUserDefaultLCID()
    lpBuffer=
Replicate(Space
(1),lnBufferLen)
    lnRetVal=GetLocaleInfo(lnLocal,lnType,@lpBuffer,lnBufferLen)
   
If Alltrim
(lpBuffer)<>tcChangeString
        lnRetVal=SetLocaleInfo(lnLocal,lnType,tcChangeString)
   
Endif
    If
lnRetVal=0
       
Return
.F.
   
Endif
 

*--更新、保存、刷新更改
    lnRetVal=SendMessage(HWND_BROADCAST,WM_WININICHANGE,"","")
             &&该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。
   
lnRetVal=SystemParametersInfo(SPI_SETDESKWALLPAPER,0,0,SPIF_SENDCHANGE)
&&该函数查询或设置系统级参数。该函数也可以在设置参数中更新用户配置文件。
   
If
lnRetVal=0
       
Return
.F.
   
Else
        Return
.T.
   
Endif
Endfunc