⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mlr.c

📁 windows环境下的一套汉字处理引擎,可以对汉字进行相应的处理
💻 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 + -