📄 mlr.c
字号:
/***********************************************************************
File name:
MLR.c
Module name:
WSENGINE
Description:
Version:
1.00.1
Created By:
Wang Zhi-dong
Date:
1993 Sep.
Used Extern:
Functions:
MlrDlgHookProc
EnumChildTrans
NewLoadString
NewLoadmenu
NewLoadMenuIndirect
NewSetMenu
NewTrackPopupMenu
NewGetMenuString
NewModifyMenu
NewModifyMenuIndirect
NewChangeMenu
NewInsertMenu
NewMessageBox
NewAppendMenu
EnableMLR
_InitMlr
_ExitMlr
Exports:
WseTranslateMenu
WseTranslateDialogBox
***********************************************************************/
#include <Windows.h>
#include <Mate.h>
#include "engine.h"
extern HINSTANCE hInst;
extern HCODE wDefaultCode;
BOOL bEnableMlr = TRUE;
HHOOK hhMlrDlg = NULL;
LRESULT CALLBACK MlrDlgHookProc (int code, WPARAM wParam, CWPSTRUCT *lParam);
// BOOL far CheckSBCSApps (void);
HTRAP hTrapLoadString;
HTRAP hTrapMessageBox;
HTRAP hTrapModifyMenu;
HTRAP hTrapChangeMenu;
HTRAP hTrapAppendMenu;
HTRAP hTrapInsertMenu;
HTRAP hTrapLoadMenu;
HTRAP hTrapLoadMenuIndirect;
HTRAP hTrapTrackPopupMenu;
HTRAP hTrapSetMenu;
HTRAP hTrapGetMenuString;
BOOL FAR EnableMLR (int wVal)
{
if (wVal && !bEnableMlr)
{
WseEnableProcTrap (hTrapLoadString);
WseEnableProcTrap (hTrapModifyMenu);
WseEnableProcTrap (hTrapChangeMenu);
WseEnableProcTrap (hTrapAppendMenu);
WseEnableProcTrap (hTrapInsertMenu);
WseEnableProcTrap (hTrapLoadMenu);
WseEnableProcTrap (hTrapLoadMenuIndirect);
// WseEnableProcTrap (hTrapGetMenuString);
WseEnableProcTrap (hTrapMessageBox);
// WseEnableProcTrap (hTrapTrackPopupMenu);
// WseEnableProcTrap (hTrapSetMenu);
hhMlrDlg = SetWindowsHookEx (WH_CALLWNDPROC,
(HOOKPROC)MlrDlgHookProc,
hInst,
NULL);
}
else if (!wVal && bEnableMlr)
{
WseDisableProcTrap (hTrapLoadString);
WseDisableProcTrap (hTrapModifyMenu);
WseDisableProcTrap (hTrapChangeMenu);
WseDisableProcTrap (hTrapAppendMenu);
WseDisableProcTrap (hTrapInsertMenu);
WseDisableProcTrap (hTrapLoadMenu);
WseDisableProcTrap (hTrapLoadMenuIndirect);
// WseDisableProcTrap (hTrapGetMenuString);
WseDisableProcTrap (hTrapMessageBox);
// WseDisableProcTrap (hTrapTrackPopupMenu);
// WseDisableProcTrap (hTrapSetMenu);
UnhookWindowsHookEx (hhMlrDlg);
hhMlrDlg = NULL;
}
bEnableMlr = wVal;
return TRUE;
}
BOOL WINAPI ModifyMenuDirect (HMENU hMenu, UINT wID, UINT wFlag,
UINT wNewID, LPCSTR lpStr)
{
if (WseIsProcTrapEnabled (hTrapModifyMenu))
{
BOOL bRet;
WseDisableProcTrap (hTrapModifyMenu);
bRet = ModifyMenu (hMenu, wID, wFlag, wNewID, lpStr);
WseEnableProcTrap (hTrapModifyMenu);
return bRet;
}
return ModifyMenu (hMenu, wID, wFlag, wNewID, lpStr);
}
BOOL WINAPI NewModifyMenu (HMENU hMenu, UINT wID, UINT wFlag,
UINT wNewID, LPCSTR lpStr)
{
BOOL bRet;
WseDisableProcTrap (hTrapModifyMenu);
if (!(wFlag & (MF_BITMAP | MF_OWNERDRAW)) && lpStr && *lpStr)
{
NPSTR pStr = (NPSTR)LocalAlloc (LPTR, 64);
WseTranslateString (HTRANS_ENGLISH_DEFAULT, (LPSTR)lpStr, 0, pStr, 63);
bRet = ModifyMenu (hMenu, wID, wFlag, wNewID, pStr);
LocalFree ((HANDLE)pStr);
}
else
bRet = ModifyMenu (hMenu, wID, wFlag, wNewID, lpStr);
WseEnableProcTrap (hTrapModifyMenu);
return bRet;
}
BOOL WINAPI NewAppendMenu (HMENU hMenu, UINT wFlag, UINT wID,
LPCSTR lpStr)
{
BOOL bRet;
WseDisableProcTrap (hTrapAppendMenu);
if (!(wFlag & (MF_BITMAP | MF_OWNERDRAW)) && lpStr && *lpStr)
{
NPSTR pStr = (NPSTR)LocalAlloc (LPTR, 64);
WseTranslateString (HTRANS_ENGLISH_DEFAULT, (LPSTR)lpStr, 0, pStr, 63);
bRet = AppendMenu (hMenu, wFlag, wID, pStr);
LocalFree ((HANDLE)pStr);
}
else
bRet = AppendMenu (hMenu, wFlag, wID, lpStr);
WseEnableProcTrap (hTrapAppendMenu);
return bRet;
}
int WINAPI NewMessageBox(HWND hWnd, LPCSTR lpMsg, LPCSTR lpTitle, UINT wTag)
{
int iRet;
NPSTR pMsg, pTitle;
WseDisableProcTrap (hTrapMessageBox);
iRet = lstrlen(lpMsg);
pMsg = (NPSTR)LocalAlloc (LPTR, iRet+2);
WseTranslateString (HTRANS_ENGLISH_DEFAULT,
(LPSTR)lpMsg, iRet+1, pMsg, iRet+1);
iRet = lstrlen(lpTitle);
pTitle = (NPSTR)LocalAlloc (LPTR, iRet+2);
WseTranslateString (HTRANS_ENGLISH_DEFAULT,
(LPSTR)lpTitle, iRet+1, pTitle, iRet+1);
iRet = MessageBox (hWnd, pMsg, pTitle, wTag);
LocalFree ((HANDLE)pMsg);
LocalFree ((HANDLE)pTitle);
WseEnableProcTrap (hTrapMessageBox);
return iRet;
}
BOOL WINAPI NewInsertMenu (HMENU hMenu, UINT wID, UINT wFlag,
UINT wNewID, LPCSTR lpStr)
{
BOOL bRet;
WseDisableProcTrap (hTrapInsertMenu);
if (!(wFlag & (MF_BITMAP | MF_OWNERDRAW)) && lpStr && *lpStr)
{
NPSTR pStr = (NPSTR)LocalAlloc (LPTR, 64);
WseTranslateString (HTRANS_ENGLISH_DEFAULT, (LPSTR)lpStr, 0, pStr, 63);
bRet = InsertMenu (hMenu, wID, wFlag, wNewID, pStr);
LocalFree ((HANDLE)pStr);
}
else
bRet = InsertMenu (hMenu, wID, wFlag, wNewID, lpStr);
WseEnableProcTrap (hTrapInsertMenu);
return bRet;
}
BOOL WINAPI NewChangeMenu (HMENU hMenu, UINT wPos, LPCSTR lpStr,
UINT wID, UINT wFlag)
{
BOOL bRet;
WseDisableProcTrap (hTrapChangeMenu);
if (!(wFlag & (MF_BITMAP | MF_OWNERDRAW)) && lpStr && *lpStr)
{
NPSTR pStr = (NPSTR)LocalAlloc (LPTR, 64);
WseTranslateString (HTRANS_ENGLISH_DEFAULT, (LPSTR)lpStr, 0, pStr, 63);
bRet = ChangeMenu (hMenu, wPos, pStr, wID, wFlag);
LocalFree ((HANDLE)pStr);
}
else
bRet = ChangeMenu (hMenu, wPos, lpStr, wID, wFlag);
WseEnableProcTrap (hTrapChangeMenu);
return bRet;
}
BOOL WINAPI WseTranslateMenu (HTRANS hTrans, HMENU hMenu)
{
int i = GetMenuItemCount (hMenu);
int iCnt = i;
while (i > 0)
{
HMENU hSubMenu;
i--;
hSubMenu = GetSubMenu (hMenu, i);
if (hSubMenu)
{
// if (!(GetMenuState (hMenu, i, MF_BYPOSITION) & (MF_BITMAP | MF_SEPARATOR)))
{
NPSTR pStr = (NPSTR)LocalAlloc (LPTR, 64);
if (GetMenuString (hMenu, i, pStr, 63, MF_BYPOSITION))
///////////////////////////// Skip the SOL.EXE Main Menu //////////////////////
// if (iCnt != 2 || ((i != 1 || lstrcmp (pStr, "&Help") != NULL) &&
// (i != 0 || lstrcmp (pStr, "&Game") != NULL) ))
{
// if (lstrcmpi (pStr, "&File"))
WseTranslateString (hTrans, pStr, 0, pStr, 63);
ModifyMenuDirect (hMenu, (UINT)i, MF_BYPOSITION | MF_STRING | MF_POPUP,
(UINT)hSubMenu, pStr);
}
LocalFree ((HANDLE)pStr);
}
WseTranslateMenu (hTrans, hSubMenu);
}
else
{
if (!(GetMenuState (hMenu, i, MF_BYPOSITION) & (MF_BITMAP | MF_SEPARATOR)))
{
NPSTR pStr = (NPSTR)LocalAlloc (LPTR, 64);
if (GetMenuString (hMenu, i, pStr, 63, MF_BYPOSITION))
{
// if (lstrcmpi (pStr, "&File") &&
// lstrcmpi (pStr, "&Print...\aCtrl+Shift+F12") &&
// lstrcmpi (pStr, "Send &Mail...") )
{
WseTranslateString (hTrans, pStr, 0, pStr, 63);
ModifyMenuDirect (hMenu, i, MF_BYPOSITION | MF_STRING,
GetMenuItemID (hMenu, i), pStr);
}
}
LocalFree ((HANDLE)pStr);
}
}
}
return TRUE;
}
BOOL CALLBACK EnumChildTrans (HWND hWnd, HTRANS hTrans, NPSTR pStr)
{
GetWindowText (hWnd, pStr, 255);
WseTranslateString (hTrans, pStr, 0, pStr, 255);
SetWindowText (hWnd, pStr);
return TRUE;
}
BOOL WINAPI WseTranslateDialogBox (HTRANS hTrans, HWND hWnd)
{
NPSTR pStr;
HMENU hMenu;
if (!IsWindow (hWnd))
return FALSE;
if (GetParent (hWnd) == NULL)
{
hMenu = GetSystemMenu (hWnd, FALSE);
if (hMenu)
WseTranslateMenu (hTrans, hMenu);
hMenu = GetMenu (hWnd);
if (hMenu)
{
WseTranslateMenu (hTrans, hMenu);
DrawMenuBar (hWnd);
}
}
pStr = (NPSTR)LocalAlloc (LPTR, 256);
if (!pStr)
return FALSE;
EnumChildWindows (hWnd, (FARPROC)EnumChildTrans, MAKELONG (pStr, hTrans));
if (GetParent (hWnd) && GetWindowTextLength (hWnd) > 1)
{
GetWindowText (hWnd, pStr, 255);
WseTranslateString (hTrans, pStr, 0, pStr, 255);
SetWindowText (hWnd, pStr);
// CheckSBCSApps ();
}
LocalFree ((HANDLE)pStr);
return TRUE;
}
static BOOL bUsed = FALSE;
int WINAPI NewLoadString (HINSTANCE hInstance, UINT wID, LPSTR lpStr, int wSize)
{
int wCnt;
WseDisableProcTrap (hTrapLoadString);
if (bEnableMlr && !bUsed && !IsBadWritePtr (lpStr, wSize))
{
NPSTR pStr = (NPSTR)LocalAlloc (LPTR, 256);
if (pStr)
{
bUsed = TRUE;
wCnt = LoadString (hInstance, wID, pStr, 256);
pStr[wCnt] = 0;
wCnt = WseTranslateString (HTRANS_ENGLISH_DEFAULT,
pStr, wCnt, lpStr, wSize);
lpStr[wCnt] = 0;
bUsed = FALSE;
LocalFree ((HANDLE)pStr);
}
else
wCnt = LoadString (hInstance, wID, lpStr, wSize);
}
else
wCnt = LoadString (hInstance, wID, lpStr, wSize);
WseEnableProcTrap (hTrapLoadString);
return wCnt;
}
HMENU WINAPI NewLoadMenu (HINSTANCE hInstance, LPCSTR lpName)
{
HMENU hMenu;
WseDisableProcTrap (hTrapLoadMenu);
hMenu = LoadMenu (hInstance, lpName);
if (bEnableMlr)
WseTranslateMenu (HTRANS_ENGLISH_DEFAULT, hMenu);
WseEnableProcTrap (hTrapLoadMenu);
return hMenu;
}
HMENU WINAPI NewLoadMenuIndirect (const void FAR*lpMenuDat)
{
HMENU hMenu;
WseDisableProcTrap (hTrapLoadMenuIndirect);
hMenu = LoadMenuIndirect (lpMenuDat);
if (bEnableMlr)
WseTranslateMenu (HTRANS_ENGLISH_DEFAULT, hMenu);
WseEnableProcTrap (hTrapLoadMenuIndirect);
return hMenu;
}
BOOL WINAPI NewSetMenu (HWND hWnd, HMENU hMenu)
{
BOOL bRet;
WseDisableProcTrap (hTrapSetMenu);
if (bEnableMlr)
WseTranslateMenu (HTRANS_ENGLISH_DEFAULT, hMenu);
bRet = SetMenu (hWnd, hMenu);
WseEnableProcTrap (hTrapSetMenu);
return bRet;
}
BOOL WINAPI NewTrackPopupMenu (HMENU hMenu, UINT A, int B, int C, int D,
HWND E, const RECT FAR* F)
{
BOOL bRet;
WseDisableProcTrap (hTrapTrackPopupMenu);
if (bEnableMlr)
WseTranslateMenu (HTRANS_ENGLISH_DEFAULT, hMenu);
bRet = TrackPopupMenu (hMenu, A, B, C, D, E, F);
WseEnableProcTrap (hTrapTrackPopupMenu);
return bRet;
}
int WINAPI NewGetMenuString (HMENU hMenu, UINT wID, LPSTR lpStr, UINT wSize, UINT wTag)
{
int iRet;
WseDisableProcTrap (hTrapGetMenuString);
iRet = GetMenuString (hMenu, wID, lpStr, wSize, wTag);
/*
if (iRet == 8)
{
char szChar[10];
WseTranslateString (HTRANS_ENGLISH_DEFAULT, "&File", 0, szChar, 9);
if (lstrcmp (szChar, lpStr) == NULL)
{
lstrcpy (lpStr, "&File");
iRet = 5;
}
}
*/
WseEnableProcTrap (hTrapGetMenuString);
return iRet;
}
char szClass[16];
LRESULT CALLBACK MlrDlgHookProc (int code, WPARAM wParam, CWPSTRUCT *lParam)
{
LRESULT lRet = CallNextHookEx (hhMlrDlg, code, wParam, (LPARAM)lParam);
if (bEnableMlr && code >= 0 && lParam->message == WM_CREATE)
{
HWND hWnd = lParam->hwnd;
GetClassName (hWnd, szClass, 15);
/*
{
OutputDebugString ("\nTMTM: ");
OutputDebugString (szClass);
}
*/
if (lstrcmpi (szClass, "Edit") != NULL &&
lstrcmpi (szClass, "RTFCTL") != NULL )
WseTranslateWindow (HTRANS_ENGLISH_DEFAULT, hWnd);
}
return lRet;
}
extern char szSystem[];
extern char szMlrMap[];
BOOL FAR _InitMlr ()
{
hTrapLoadString = WseMakeProcTrap ((FARPROC)LoadString, (FARPROC)NewLoadString);
hTrapModifyMenu = WseMakeProcTrap ((FARPROC)ModifyMenu, (FARPROC)NewModifyMenu);
hTrapChangeMenu = WseMakeProcTrap ((FARPROC)ChangeMenu, (FARPROC)NewChangeMenu);
hTrapAppendMenu = WseMakeProcTrap ((FARPROC)AppendMenu, (FARPROC)NewAppendMenu);
hTrapInsertMenu = WseMakeProcTrap ((FARPROC)InsertMenu, (FARPROC)NewInsertMenu);
hTrapLoadMenuIndirect = WseMakeProcTrap ((FARPROC)LoadMenuIndirect, (FARPROC)NewLoadMenuIndirect);
// hTrapTrackPopupMenu = WseMakeProcTrap ((FARPROC)TrackPopupMenu, (FARPROC)NewTrackPopupMenu);
hTrapLoadMenu = WseMakeProcTrap ((FARPROC)LoadMenu, (FARPROC)NewLoadMenu);
// hTrapSetMenu = WseMakeProcTrap ((FARPROC)SetMenu, (FARPROC)NewSetMenu);
// hTrapGetMenuString = WseMakeProcTrap ((FARPROC)GetMenuString, (FARPROC)NewGetMenuString);
hTrapMessageBox = WseMakeProcTrap ((FARPROC)MessageBox, (FARPROC)NewMessageBox);
hhMlrDlg = SetWindowsHookEx (WH_CALLWNDPROC,
(HOOKPROC)MlrDlgHookProc, hInst, NULL);
EnableMLR (WseGetProfileInt (szSystem, szMlrMap, 1));
return TRUE;
}
BOOL FAR _ExitMlr ()
{
WseFreeProcTrap (hTrapLoadString);
WseFreeProcTrap (hTrapModifyMenu);
WseFreeProcTrap (hTrapChangeMenu);
WseFreeProcTrap (hTrapAppendMenu);
WseFreeProcTrap (hTrapInsertMenu);
WseFreeProcTrap (hTrapLoadMenuIndirect);
// WseFreeProcTrap (hTrapTrackPopupMenu);
WseFreeProcTrap (hTrapLoadMenu);
// WseFreeProcTrap (hTrapSetMenu);
// WseFreeProcTrap (hTrapGetMenuString);
WseFreeProcTrap (hTrapMessageBox);
if (hhMlrDlg)
{
UnhookWindowsHookEx (hhMlrDlg);
hhMlrDlg = NULL;
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -