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