Option Explicit
  Public hDlgHook As Long
          
        Public Const FONT_FACE = "Tahoma"
          
        Public Const WH_CBT = 5
        Public Const HCBT_ACTIVATE = 5
        Public Const WM_SETFONT = &H30
        Declare Function CreateFont Lib "gdi32" Alias "CreateFontA" (ByVal h As Long, ByVal w As Long, ByVal E As Long, ByVal O As Long, ByVal w As Long, ByVal i As Long, ByVal U As Long, ByVal s As Long, ByVal C As Long, ByVal OP As Long, ByVal CP As Long, ByVal Q As Long, ByVal PAF As Long, ByVal F As String) As Long
        Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal ParenthWnd As Long, ByVal ChildhWnd As Long, ByVal ClassName As String, ByVal Caption As String) As Long
        Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hMod As Long, ByVal dwThreadId As Long) As Long
        Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
        Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
        Declare Function GetCurrentThreadId Lib "kernel32" () As Long
        Declare Function SetWindowTextW Lib "user32" (ByVal hWnd As Long, ByVal lpString As Long) As Long
        Declare Function MessageBoxW Lib "user32.dll" (ByVal hWnd As Long, ByVal lpText As Long, ByVal lpCaption As Long, ByVal uType As Long) As Long
        
        Function UniMsgBox(strText As String, Optional iButtons As VbMsgBoxStyle = vbOKOnly, Optional strTitle As String, Optional hWnd As Long = &H0) As VbMsgBoxResult
                If strTitle = "" Then strTitle = App.Title
                hDlgHook = SetWindowsHookEx(WH_CBT, AddressOf HookProc, App.hInstance, GetCurrentThreadId())
                UniMsgBox = MessageBoxW(hWnd, StrPtr(ToUni(strText)), StrPtr(ToUni(strTitle)), iButtons)
        End Function
          
        Public Function HookProc(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
            Dim hStatic1 As Long, hStatic2 As Long, hButton As Long, hFont As Long
            HookProc = CallNextHookEx(hDlgHook, ncode, wParam, lParam)
            If ncode = HCBT_ACTIVATE Then
                hFont = CreateFont(13, 0, 0, 0, 500, 0, 0, 0, 0, 0, 0, 0, 0, FONT_FACE)
            
                hStatic1 = FindWindowEx(wParam, 0&, "Static", vbNullString)
                hStatic2 = FindWindowEx(wParam, hStatic1, "Static", vbNullString)
                If hStatic2 = 0 Then hStatic2 = hStatic1
                SendMessage hStatic2, WM_SETFONT, hFont, ByVal 1&
            
                hButton = FindWindowEx(wParam, 0&, "Button", "OK")
                SendMessage hButton, WM_SETFONT, hFont, 0
                SetWindowTextW hButton, StrPtr(ChrW(&H110) & "óng")
            
                hButton = FindWindowEx(wParam, 0&, "Button", "&Yes")
                SendMessage hButton, WM_SETFONT, hFont, 0
                SetWindowTextW hButton, StrPtr("Có")
            
                hButton = FindWindowEx(wParam, 0&, "Button", "&No")
                SendMessage hButton, WM_SETFONT, hFont, 0
                SetWindowTextW hButton, StrPtr("Không")
            
                 hButton = FindWindowEx(wParam, 0&, "Button", "&Retry")
                SendMessage hButton, WM_SETFONT, hFont, 0
                SetWindowTextW hButton, StrPtr("Th" & ChrW(&H1EED) & " l" & ChrW(&H1EA1) & "i")
            
                hButton = FindWindowEx(wParam, 0&, "Button", "Cancel")
                SendMessage hButton, WM_SETFONT, hFont, 0
                SetWindowTextW hButton, StrPtr("Thoát")
                
               UnhookWindowsHookEx hDlgHook
            End If
        End Function
Public Function ToUni(str$) As String
    Dim ansi$, UNI$, i&, sTem$, sUni$, arrUNI() As String
    ansi = "a1|a2|a3|a4|a5|a6|a8|a61a62a63a64a65a81a82a83a84a85A1|A2|A3|A4|A5|A6|A8|A61A62A63A64A65A81A82A83A84A85e1|e2|e3|e4|e5|e6|e61e62e63e64e65E1|E2|E3|E4|E5|E6|E61E62E63E64E65i1|i2|i3|i4|i5|I1|I2|I3|I4|I5|o1|o2|o3|o4|o5|o6|o7|o61o62o63o64o65o71o72o73o74o75O1|O2|O3|O4|O5|O6|O7|O61O62O63O64O65O71O72O73O74O75u1|u2|u3|u4|u5|u7|u71u72u73u74u75U1|U2|U3|U4|U5|U7|U71U72U73U74U75y1|y2|y3|y4|y5|Y1|Y2|Y3|Y4|Y5|d9|D9|"
    UNI = "E1,E0,1EA3,E3,1EA1,E2,103,1EA5,1EA7,1EA9,1EAB,1EAD,1EAF,1EB1,1EB3,1EB5,1EB7,C1,C0,1EA2,C3,1EA0,C2,102,1EA4,1EA6,1EA8,1EAA,1EAC,1EAE,1EB0,1EB2,1EB4,1EB6,E9,E8,1EBB,1EBD,1EB9,EA,1EBF,1EC1,1EC3,1EC5,1EC7,C9,C8,1EBA,1EBC,1EB8,CA,1EBE,1EC0,1EC2,1EC4,1EC6,ED,EC,1EC9,129,1ECB,CD,CC,1EC8,128,1ECA,F3,F2,1ECF,F5,1ECD,F4,1A1,1ED1,1ED3,1ED5,1ED7,1ED9,1EDB,1EDD,1EDF,1EE1,1EE3,D3,D2,1ECE,D5,1ECC,D4,1A0,1ED0,1ED2,1ED4,1ED6,1ED8,1EDA,1EDC,1EDE,1EE0,1EE2,FA,F9,1EE7,169,1EE5,1B0,1EE9,1EEB,1EED,1EEF,1EF1,DA,D9,1EE6,168,1EE4,1AF,1EE8,1EEA,1EEC,1EEE,1EF0,FD,1EF3,1EF7,1EF9,1EF5,DD,1EF2,1EF6,1EF8,1EF4,111,110"
    arrUNI = Split(UNI, ",")
    For i = 1 To Len(str)
        If IsNumeric(Mid(str, i + 1, 1)) = False Then
            sUni = sUni & Mid(str, i, 1)
        Else
            sTem = IIf(IsNumeric(Mid(str, i + 2, 1)), Mid(str, i, 3), Mid(str, i, 2))
            i = i + IIf(IsNumeric(Mid(str, i + 2, 1)), 2, 1)
            If InStr(ansi, sTem) > 0 Then sTem = ChrW("&h" & arrUNI(InStr(ansi, sTem) \ 3))
            sUni = sUni & sTem
        End If
    Next
    ToUni = sUni
End Function