Jump to content
Sign in to follow this  
funkey

English MsgBox button texts for everyone

Recommended Posts

funkey

I don't know if there is some need, but I made a simple function to use only english button names in MsgBox.

#include <WinAPI.au3>
Opt("MustDeclareVars", 1)
Global $hHookMsgBox
_MsgBoxEnglish(0, "Title", "Text")
_MsgBoxEnglish(1, "Title", "Text")
_MsgBoxEnglish(2, "Title", "Text")
_MsgBoxEnglish(3, "Title", "Text")
_MsgBoxEnglish(4, "Title", "Text")
_MsgBoxEnglish(5, "Title", "Text")
_MsgBoxEnglish(6, "Title", "Text")
_MsgBoxEnglish(7, "Title", "Text")
#region English Button text for MsgBox!!
;##########################################################
Func _MsgBoxEnglish($flag, $title, $text, $timeout = 0, $hwnd = 0)
 Local $hProcMsgBox = DllCallbackRegister("CbtHookProcMsgBox", "int", "int;int;int")
 Local $TIDMsgBox = _WinAPI_GetCurrentThreadId()
 $hHookMsgBox = _WinAPI_SetWindowsHookEx($WH_CBT, DllCallbackGetPtr($hProcMsgBox), 0, $TIDMsgBox)
 Local $iRet = MsgBox($flag, $title, $text, $timeout, $hwnd)
 _WinAPI_UnhookWindowsHookEx($hHookMsgBox)
 DllCallbackFree($hProcMsgBox)
 Return $iRet
EndFunc   ;==>_MsgBoxEnglish
Func CbtHookProcMsgBox($nCode, $wParam, $lParam, $hHookMsgBox)
 Local $RET = 0, $hBitmap = 0, $xWnd = 0
 Local $sButtonText
 If $nCode < 0 Then
  $RET = _WinAPI_CallNextHookEx($hHookMsgBox, $nCode, $wParam, $lParam)
  Return $RET
 EndIf
 Switch $nCode
  Case 5 ;5=HCBT_ACTIVATE
   _WinAPI_SetDlgItemText($wParam, 1, "OK")
   _WinAPI_SetDlgItemText($wParam, 2, "Cancel")
   _WinAPI_SetDlgItemText($wParam, 3, "&Abort")
   _WinAPI_SetDlgItemText($wParam, 4, "&Retry")
   _WinAPI_SetDlgItemText($wParam, 5, "&Ignore")
   _WinAPI_SetDlgItemText($wParam, 6, "&Yes")
   _WinAPI_SetDlgItemText($wParam, 7, "&No")
   _WinAPI_SetDlgItemText($wParam, 8, "Help")
   _WinAPI_SetDlgItemText($wParam, 10, "&Try Again")
   _WinAPI_SetDlgItemText($wParam, 11, "&Continue")
 EndSwitch
 Return
EndFunc   ;==>CbtHookProcMsgBox
Func _WinAPI_SetDlgItemText($hDlg, $nIDDlgItem, $lpString)
 Local $aRet = DllCall('user32.dll', "int", "SetDlgItemText", _
   "hwnd", $hDlg, _
   "int", $nIDDlgItem, _
   "str", $lpString)
 Return $aRet[0]
EndFunc   ;==>_WinAPI_SetDlgItemText
;##########################################################
#endregion English Button text for MsgBox!!

Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs, and the Universe
trying to produce bigger and better idiots.
So far, the Universe is winning.

Share this post


Link to post
Share on other sites
KaFu

Really nice, thanks for this example ;)!

Edit: The same approach works fine to replace the button texts of an InputBox with a custom language.

#include <WinAPI.au3>
Opt("MustDeclareVars", 1)
Global $hHookInputBox

InputBox("Test", "Eingabe")
_InputBox("Test", "Eingabe")

Func _InputBox($title, $prompt, $default = Default, $passwordchar = Default, $width = Default, $height = Default, $left = Default, $top = Default, $timeout = Default, $hwnd = Default)
    Local $hProcInputBox = DllCallbackRegister("CbtHookProcInputBox", "int", "int;int;int")
    Local $TIDInputBox = _WinAPI_GetCurrentThreadId()
    $hHookInputBox = _WinAPI_SetWindowsHookEx($WH_CBT, DllCallbackGetPtr($hProcInputBox), 0, $TIDInputBox)
    Local $iRet = InputBox($title, $prompt, $default, $passwordchar, $width, $height, $left, $top, $timeout, $hwnd)
    Local $ierror = @error
    _WinAPI_UnhookWindowsHookEx($hHookInputBox)
    DllCallbackFree($hProcInputBox)
    Return SetError($ierror, "", $iRet)
EndFunc   ;==>_InputBox

Func CbtHookProcInputBox($nCode, $wParam, $lParam, $hHookInputBox)
    Local $RET = 0, $hBitmap = 0, $xWnd = 0
    Local $sButtonText
    If $nCode < 0 Then
        $RET = _WinAPI_CallNextHookEx($hHookInputBox, $nCode, $wParam, $lParam)
        Return $RET
    EndIf
    Switch $nCode
        Case 5 ;5=HCBT_ACTIVATE
            _WinAPI_SetDlgItemText($wParam, 1, "OK")
            _WinAPI_SetDlgItemText($wParam, 2, "Abbrechen")
    EndSwitch
    Return
EndFunc   ;==>CbtHookProcInputBox

Func _WinAPI_SetDlgItemText($hDlg, $nIDDlgItem, $lpString)
    Local $aRet = DllCall('user32.dll', "int", "SetDlgItemText", _
            "hwnd", $hDlg, _
            "int", $nIDDlgItem, _
            "str", $lpString)
    Return $aRet[0]
EndFunc   ;==>_WinAPI_SetDlgItemText
Edited by KaFu

Share this post


Link to post
Share on other sites
UEZ

Nice stuff ;)

Thanks you both!

Br,

UEZ


Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×