234 lines
No EOL
10 KiB
C++
234 lines
No EOL
10 KiB
C++
#pragma once
|
||
#include <dimm.h>
|
||
|
||
#define IMM32_DLLNAME "\\imm32.dll"
|
||
#define VER_DLLNAME "\\version.dll"
|
||
|
||
#define MAX_CANDLIST 10
|
||
#define MAX_COMPSTRING_SIZE 256
|
||
|
||
#define CHT_IMEFILENAME1 "TINTLGNT.IME" // New Phonetic
|
||
#define CHT_IMEFILENAME2 "CINTLGNT.IME" // New Chang Jie
|
||
#define CHT_IMEFILENAME3 "MSTCIPHA.IME" // Phonetic 5.1
|
||
#define CHS_IMEFILENAME1 "PINTLGNT.IME" // MSPY1.5/2/3
|
||
#define CHS_IMEFILENAME2 "MSSCIPYA.IME" // MSPY3 for OfficeXP
|
||
|
||
#define LANG_CHT MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL)
|
||
#define LANG_CHS MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)
|
||
#define _CHT_HKL ( ( HKL )( INT_PTR )0xE0080404 ) // New Phonetic
|
||
#define _CHT_HKL2 ( ( HKL )( INT_PTR )0xE0090404 ) // New Chang Jie
|
||
#define _CHS_HKL ( ( HKL )( INT_PTR )0xE00E0804 ) // MSPY
|
||
#define MAKEIMEVERSION( major, minor ) ( ( DWORD )( ( ( BYTE )( major ) << 24 ) | ( ( BYTE )( minor ) << 16 ) ) )
|
||
|
||
#define IMEID_CHT_VER42 ( LANG_CHT | MAKEIMEVERSION( 4, 2 ) ) // New(Phonetic/ChanJie)IME98 : 4.2.x.x // Win98
|
||
#define IMEID_CHT_VER43 ( LANG_CHT | MAKEIMEVERSION( 4, 3 ) ) // New(Phonetic/ChanJie)IME98a : 4.3.x.x // Win2k
|
||
#define IMEID_CHT_VER44 ( LANG_CHT | MAKEIMEVERSION( 4, 4 ) ) // New ChanJie IME98b : 4.4.x.x // WinXP
|
||
#define IMEID_CHT_VER50 ( LANG_CHT | MAKEIMEVERSION( 5, 0 ) ) // New(Phonetic/ChanJie)IME5.0 : 5.0.x.x // WinME
|
||
#define IMEID_CHT_VER51 ( LANG_CHT | MAKEIMEVERSION( 5, 1 ) ) // New(Phonetic/ChanJie)IME5.1 : 5.1.x.x // IME2002(w/OfficeXP)
|
||
#define IMEID_CHT_VER52 ( LANG_CHT | MAKEIMEVERSION( 5, 2 ) ) // New(Phonetic/ChanJie)IME5.2 : 5.2.x.x // IME2002a(w/Whistler)
|
||
#define IMEID_CHT_VER60 ( LANG_CHT | MAKEIMEVERSION( 6, 0 ) ) // New(Phonetic/ChanJie)IME6.0 : 6.0.x.x // IME XP(w/WinXP SP1)
|
||
#define IMEID_CHS_VER41 ( LANG_CHS | MAKEIMEVERSION( 4, 1 ) ) // MSPY1.5 // SCIME97 or MSPY1.5 (w/Win98, Office97)
|
||
#define IMEID_CHS_VER42 ( LANG_CHS | MAKEIMEVERSION( 4, 2 ) ) // MSPY2 // Win2k/WinME
|
||
#define IMEID_CHS_VER53 ( LANG_CHS | MAKEIMEVERSION( 5, 3 ) ) // MSPY3 // WinXP
|
||
|
||
struct SInputLocale
|
||
{
|
||
HKL m_hKL; // Keyboard layout
|
||
WCHAR m_wszLangAbb[3]; // Language abbreviation
|
||
WCHAR m_wszLang[64]; // Localized language name
|
||
};
|
||
|
||
struct SCandList
|
||
{
|
||
WCHAR awszCandidate[ MAX_CANDLIST ][ 256 ];
|
||
CEtUIUniBuffer HoriCand; // Candidate list string (for horizontal candidate window)
|
||
int nFirstSelected; // First character position of the selected string in HoriCand
|
||
int nHoriSelectedLen; // Length of the selected string in HoriCand
|
||
DWORD dwCount; // Number of valid entries in the candidate list
|
||
DWORD dwSelection; // Currently selected candidate entry relative to page top
|
||
DWORD dwPageSize;
|
||
int nReadingError; // Index of the error character
|
||
bool bShowWindow; // Whether the candidate list window is visible
|
||
SUICoord CandidateCoord;
|
||
};
|
||
|
||
class CEtUIIME
|
||
{
|
||
public:
|
||
CEtUIIME(void);
|
||
virtual ~CEtUIIME(void);
|
||
|
||
protected:
|
||
enum
|
||
{
|
||
INDICATOR_NON_IME,
|
||
INDICATOR_CHS,
|
||
INDICATOR_CHT,
|
||
INDICATOR_KOREAN,
|
||
INDICATOR_JAPANESE
|
||
};
|
||
enum IMESTATE
|
||
{
|
||
IMEUI_STATE_OFF,
|
||
IMEUI_STATE_ON,
|
||
IMEUI_STATE_ENGLISH
|
||
};
|
||
|
||
static int s_nRefCount;
|
||
|
||
static HINSTANCE s_hDllImm32;
|
||
static HINSTANCE s_hDllIme;
|
||
static HINSTANCE s_hDllVer;
|
||
static HIMC s_hImcDef;
|
||
|
||
static bool s_bEnableImeSystem;
|
||
static IMESTATE s_ImeState;
|
||
|
||
static int s_nCompCaret;
|
||
static int s_nFirstTargetConv;
|
||
static float s_fCompStringX;
|
||
static float s_fCompStringY;
|
||
static BYTE s_abyCompStringAttr[ MAX_COMPSTRING_SIZE ];
|
||
static DWORD s_adwCompStringClause[ MAX_COMPSTRING_SIZE ];
|
||
static WCHAR s_wszReadingString[ 32 ];
|
||
static HKL s_hklCurrent;
|
||
static SCandList s_CandList;
|
||
static bool s_bVerticalCand;
|
||
static bool s_bShowReadingWindow;
|
||
static bool s_bHorizontalReading;
|
||
|
||
static CEtUIUniBuffer s_CompString;
|
||
static std::vector< SInputLocale > s_vecLocale;
|
||
static LPWSTR s_pwszCurrIndicator;
|
||
static WCHAR s_aszIndicator[ 5 ][ 3 ];
|
||
static bool s_bChineseIME;
|
||
static bool s_bInsertOnType;
|
||
|
||
#if defined(DEBUG) || defined(_DEBUG)
|
||
static bool m_bIMEStaticMsgProcCalled;
|
||
#endif
|
||
|
||
public:
|
||
static bool s_bHideCaret;
|
||
|
||
// <20><><EFBFBD><EFBFBD> <20>߱<EFBFBD>IME<4D><45> <20><><EFBFBD><EFBFBD> mainframe<6D><65><EFBFBD><EFBFBD> WM_IME_COMPOSITION<4F><4E> return 1<>ع<EFBFBD><D8B9><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳪 ĵ<><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD>찡 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD> <20>ȶ߰Եȴ<D4B5>.
|
||
// <20><EFBFBD><D7B7><EFBFBD> <20><><EFBFBD>ν<EFBFBD><CEBD><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴµ<CFB4>, <20>̶<EFBFBD> SendCompString<6E><67><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(GCS_RESULTSTR<54><EFBFBD><DEBC><EFBFBD> <20>ö<EFBFBD>) <20>ι<EFBFBD> <20><><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Եȴ<D4B5>.
|
||
// <20>̷<EFBFBD> <20><> SendCompString<6E><67> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> ó<><C3B3><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD>ۺ<EFBFBD><DBBA><EFBFBD><EFBFBD><EFBFBD>.
|
||
static bool s_bRESULTSTR_NotSendComp;
|
||
|
||
// <20><>Ŀ<EFBFBD><C4BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IME<4D><45> <20><>Ȱ<EFBFBD><C8B0>ȭ <20>Ұ<EFBFBD><D2B0><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> false<73><65>.
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>쿣 false<73><65>, <20>ؿܹ<D8BF><DCB9><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> true<75><65>.
|
||
static bool s_bDisableIMEonKillFocus;
|
||
|
||
// <20><><EFBFBD><EFBFBD> <20>߱<EFBFBD>Ŭ<EFBFBD><EFBFBD> souguIME<4D><45><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ABCIME<4D><45> <20><>ȯ<EFBFBD><C8AF> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ٰ<EFBFBD> <20>Ѵ<EFBFBD>.
|
||
// <20>˾ƺ<CBBE><C6BA><EFBFBD> GCS_COMPCLAUSE<53><45> ó<><C3B3><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD> IMEapi<70><69> ȣ<><C8A3><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ſ<EFBFBD><C5BF><EFBFBD>.
|
||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD> <20>߱<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD><CAB1><EFBFBD> <20>ϰڴ<CFB0>. <20>⺻<EFBFBD><E2BABB> true<75≯<EFBFBD> _CH<43><48> <20><><EFBFBD>쿡<EFBFBD><ECBFA1> false<73><65>.
|
||
//
|
||
// <20><> <20>Ѱ<EFBFBD><D1B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD>°<EFBFBD>, <20><><EFBFBD><EFBFBD>ABCIME<4D><45> <20>ѱ<EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20>ƿ<EFBFBD> <20>ȵ<EFBFBD><C8B5>ư<EFBFBD><C6B0>ٴ<EFBFBD> <20><><EFBFBD>̴<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||
// <20>̰<EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴѰ<C6B4>, MS<4D><53><EFBFBD>忡<EFBFBD><E5BFA1><EFBFBD><EFBFBD> <20>۵<EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>.
|
||
static bool s_bProcess_GCS_COMPCLAUSE;
|
||
|
||
// <20>̱<EFBFBD> Ŭ<><EFBFBD><F3BFA1BC><EFBFBD> IMEEditBox, LineIMEEditBox<6F><78> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ƴ<C6B4> <20>Ѵ<EFBFBD>.
|
||
// <20><EFBFBD><D7B7><EFBFBD>, UI<55><49><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20>ٲ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ°<CFB4> <20>ʹ<EFBFBD> <20>ƴѰ<C6B4> <20><><EFBFBD>Ƽ<EFBFBD>, <20>÷<EFBFBD><C3B7><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
|
||
// <20>̰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IME<4D><45>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IME<4D><45> <20>۵<EFBFBD><DBB5><EFBFBD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20>ȴ<EFBFBD>.
|
||
static bool s_bDisableIMEonIMEControl;
|
||
|
||
protected:
|
||
static void SetIMEMode( DWORD dwNewConvMode, DWORD dwNewSentMode, BOOL fFlag );
|
||
|
||
public:
|
||
static bool IsNativeMode();
|
||
static void ConverseNativeToEng() { SetIMEMode ( IME_CMODE_NATIVE, 0, FALSE ); }
|
||
static void ConverseEngToNative() { SetIMEMode ( IME_CMODE_NATIVE, 0, TRUE ); }
|
||
static void ConverseFullToHalf() { SetIMEMode ( IME_CMODE_FULLSHAPE, 0, FALSE ); }
|
||
|
||
public:
|
||
static void Initialize();
|
||
static void Uninitialize();
|
||
|
||
static void StaticOnCreateDevice();
|
||
static bool StaticMsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam );
|
||
|
||
static void EnableImeSystem( bool bEnable ) { s_bEnableImeSystem = bEnable; }
|
||
|
||
static int GetCompStringLength() { return s_CompString.GetTextSize(); }
|
||
static std::wstring GetCompString() { return s_CompString.GetBuffer(); }
|
||
|
||
// MainFrame<6D>ܿ<EFBFBD><DCBF><EFBFBD><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>ؾ<EFBFBD><D8BE>ؼ<EFBFBD> public<69><63><EFBFBD><EFBFBD> <20><><EFBFBD>д<EFBFBD>.
|
||
static void CheckToggleState();
|
||
|
||
protected:
|
||
static WORD GetLanguage() { return LOWORD( s_hklCurrent ); }
|
||
static WORD GetPrimaryLanguage() { return PRIMARYLANGID( LOWORD( s_hklCurrent ) ); }
|
||
static WORD GetSubLanguage() { return SUBLANGID( LOWORD( s_hklCurrent ) ); }
|
||
static void SendKey( BYTE nVirtKey );
|
||
static DWORD GetImeId( UINT uIndex = 0 );
|
||
static void CheckInputLocale();
|
||
static void SetupImeApi();
|
||
static void ResetCompositionString();
|
||
static void GetReadingWindowOrientation( DWORD dwId );
|
||
static void GetPrivateReadingString();
|
||
|
||
public:
|
||
// Empty implementation of the IMM32 API
|
||
static INPUTCONTEXT* WINAPI Dummy_ImmLockIMC( HIMC ) { return NULL; }
|
||
static BOOL WINAPI Dummy_ImmUnlockIMC( HIMC ) { return FALSE; }
|
||
static LPVOID WINAPI Dummy_ImmLockIMCC( HIMCC ) { return NULL; }
|
||
static BOOL WINAPI Dummy_ImmUnlockIMCC( HIMCC ) { return FALSE; }
|
||
static BOOL WINAPI Dummy_ImmDisableTextFrameService( DWORD ) { return TRUE; }
|
||
static LONG WINAPI Dummy_ImmGetCompositionStringW( HIMC, DWORD, LPVOID, DWORD ) { return IMM_ERROR_GENERAL; }
|
||
static DWORD WINAPI Dummy_ImmGetCandidateListW( HIMC, DWORD, LPCANDIDATELIST, DWORD ) { return 0; }
|
||
static HIMC WINAPI Dummy_ImmGetContext( HWND ) { return NULL; }
|
||
static BOOL WINAPI Dummy_ImmReleaseContext( HWND, HIMC ) { return FALSE; }
|
||
static HIMC WINAPI Dummy_ImmAssociateContext( HWND, HIMC ) { return NULL; }
|
||
static BOOL WINAPI Dummy_ImmGetOpenStatus( HIMC ) { return 0; }
|
||
static BOOL WINAPI Dummy_ImmSetOpenStatus( HIMC, BOOL ) { return 0; }
|
||
static BOOL WINAPI Dummy_ImmGetConversionStatus( HIMC, LPDWORD, LPDWORD ) { return 0; }
|
||
static HWND WINAPI Dummy_ImmGetDefaultIMEWnd( HWND ) { return NULL; }
|
||
static UINT WINAPI Dummy_ImmGetIMEFileNameA( HKL, LPSTR, UINT ) { return 0; }
|
||
static UINT WINAPI Dummy_ImmGetVirtualKey( HWND ) { return 0; }
|
||
static BOOL WINAPI Dummy_ImmNotifyIME( HIMC, DWORD, DWORD, DWORD ) { return FALSE; }
|
||
static BOOL WINAPI Dummy_ImmSetConversionStatus( HIMC, DWORD, DWORD ) { return FALSE; }
|
||
static BOOL WINAPI Dummy_ImmSimulateHotKey( HWND, DWORD ) { return FALSE; }
|
||
static BOOL WINAPI Dummy_ImmIsIME( HKL ) { return FALSE; }
|
||
|
||
// Traditional Chinese IME
|
||
static UINT WINAPI Dummy_GetReadingString( HIMC, UINT, LPWSTR, PINT, BOOL*, PUINT ) { return 0; }
|
||
static BOOL WINAPI Dummy_ShowReadingWindow( HIMC, BOOL ) { return FALSE; }
|
||
|
||
// Verion library imports
|
||
static BOOL APIENTRY Dummy_VerQueryValueA( const LPVOID, LPSTR, LPVOID *, PUINT ) { return 0; }
|
||
static BOOL APIENTRY Dummy_GetFileVersionInfoA( LPSTR, DWORD, DWORD, LPVOID ) { return 0; }
|
||
static DWORD APIENTRY Dummy_GetFileVersionInfoSizeA( LPSTR, LPDWORD ) { return 0; }
|
||
|
||
// Function pointers: IMM32
|
||
static INPUTCONTEXT* (WINAPI * _ImmLockIMC)( HIMC );
|
||
static BOOL (WINAPI * _ImmUnlockIMC)( HIMC );
|
||
static LPVOID (WINAPI * _ImmLockIMCC)( HIMCC );
|
||
static BOOL (WINAPI * _ImmUnlockIMCC)( HIMCC );
|
||
static BOOL (WINAPI * _ImmDisableTextFrameService)( DWORD );
|
||
static LONG (WINAPI * _ImmGetCompositionStringW)( HIMC, DWORD, LPVOID, DWORD );
|
||
static DWORD (WINAPI * _ImmGetCandidateListW)( HIMC, DWORD, LPCANDIDATELIST, DWORD );
|
||
static HIMC (WINAPI * _ImmGetContext)( HWND );
|
||
static BOOL (WINAPI * _ImmReleaseContext)( HWND, HIMC );
|
||
static HIMC (WINAPI * _ImmAssociateContext)( HWND, HIMC );
|
||
static BOOL (WINAPI * _ImmGetOpenStatus)( HIMC );
|
||
static BOOL (WINAPI * _ImmSetOpenStatus)( HIMC, BOOL );
|
||
static BOOL (WINAPI * _ImmGetConversionStatus)( HIMC, LPDWORD, LPDWORD );
|
||
static HWND (WINAPI * _ImmGetDefaultIMEWnd)( HWND );
|
||
static UINT (WINAPI * _ImmGetIMEFileNameA)( HKL, LPSTR, UINT );
|
||
static UINT (WINAPI * _ImmGetVirtualKey)( HWND );
|
||
static BOOL (WINAPI * _ImmNotifyIME)( HIMC, DWORD, DWORD, DWORD );
|
||
static BOOL (WINAPI * _ImmSetConversionStatus)( HIMC, DWORD, DWORD );
|
||
static BOOL (WINAPI * _ImmSimulateHotKey)( HWND, DWORD );
|
||
static BOOL (WINAPI * _ImmIsIME)( HKL );
|
||
|
||
// Function pointers: Traditional Chinese IME
|
||
static UINT (WINAPI * _GetReadingString)( HIMC, UINT, LPWSTR, PINT, BOOL*, PUINT );
|
||
static BOOL (WINAPI * _ShowReadingWindow)( HIMC, BOOL );
|
||
|
||
// Function pointers: Verion library imports
|
||
static BOOL (APIENTRY * _VerQueryValueA)( const LPVOID, LPSTR, LPVOID *, PUINT );
|
||
static BOOL (APIENTRY * _GetFileVersionInfoA)( LPSTR, DWORD, DWORD, LPVOID );
|
||
static DWORD (APIENTRY * _GetFileVersionInfoSizeA)( LPSTR, LPDWORD );
|
||
}; |