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

📄 hikerwbui.cpp

📁 自己用Markov模型做的一个整句物笔输入法的原型
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "stdafx.h"
#include "Afxtempl.h"
#include "HikerWBStateWnd.h"
#include "MakeWordDlg.h"
#include "softkeyboard.h"
#include "HikerWBFunc.h"
#include "HikerWBUI.h"

static unsigned char gVKArr[47] = 
		{192, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 189, 187, \
		 81, 87, 69, 82, 84, 89, 85, 73, 79, 80, 219, 221, 220, \
		 65, 83, 68, 70, 71, 72, 74, 75, 76, 186, 222, \
		 90, 88, 67, 86, 66, 78, 77, 188, 190, 191};

static unsigned char gKeyArr[SOFTKEYBOARD_NUM*2][SOFTKEYBOARD_LEN] = {
		/*PC keyboard*/
		{
			SOFTKEY_PCC
		},
		{
			SOFTKEY_PCL
		},
		/*Greece letter*/																																								
		{
			SOFTKEY_GLC
		},
		{
			SOFTKEY_GLL
		},
		/*Russia letter*/																																							
		{
			SOFTKEY_RLC
		},
		{
			SOFTKEY_RLL
		},
		/*chinese spell letter*/																																									
		{
			SOFTKEY_NON
		},	
		{
			SOFTKEY_CSL
		},
		/*phonetic notation*/																																										
		{
			SOFTKEY_NON
		},	
		{
			SOFTKEY_CPN
		},
		/*Japanese hiragana */																																								
		{
			SOFTKEY_JHC
		},		
		{
			SOFTKEY_JHL
		},
		/*Japanese katakana*/																																			
		{
			SOFTKEY_JKC
		},
		{
			SOFTKEY_JKL
		},
		/*punctuation*/																																						
		{
			SOFTKEY_NON
		},
		{
			SOFTKEY_PCT
		},
		/*serial number*/																					
		{
			SOFTKEY_SNC
		},
		{
			SOFTKEY_SNL
		},
		/*mathematics notation*/
		{
			SOFTKEY_NON
		},
		{
			SOFTKEY_MAT
		},
		/*special notation*/																																								
		{
			SOFTKEY_NON
		},
		{
			SOFTKEY_SPC
		},
		/*全角字符*/
		{
			SOFTKEY_SBC
		},
		{
			SOFTKEY_SBL
		},
};

static unsigned char gPunctuation[] = "~!@#$%^&*()_+{}|:\"<>?`-=[]\\;',./";
static unsigned char gChinsesPunc[] = "~!·#¥%…ˉ*()—+{}|:“《》?`-=[]、;‘,。/";


static giLastKey = -1;


static HHOOK hHook;
static HINSTANCE hInstDLL;
static HOOKPROC pHookProc;

CHikerWBStateWnd gStaWnd;



//05.11.20

//typedef BOOL (*LPFTRANSLATEPROC)(unsigned char*, unsigned char*, int&, int&, int*, int*);
//static LPFTRANSLATEPROC pTranslateProc;
//
//typedef BOOL (*LPFGETWORDSPROC)(unsigned char*, unsigned char*, int, unsigned char*, int&);
//static LPFGETWORDSPROC pGetWordsProc;
//
//typedef BOOL (*LPFGETWORDSELPROC)(unsigned char* pwords, int wdno, unsigned char* pword);
//static LPFGETWORDSELPROC pGetWordSelProc;
//
//typedef BOOL (*LPFGETCODESPROC)(unsigned char*, unsigned char*, int&);
//static LPFGETCODESPROC pGetCodesProc;
//
//typedef BOOL (*LPFTRAINPROC)(unsigned char*, unsigned char*, int*);
//static LPFTRAINPROC pTrainProc;
//
//typedef BOOL (*LPFPYGETWORDSPROC)(unsigned char*, unsigned char*, int&);
//static LPFPYGETWORDSPROC pPYGetWordsProc;
//
//typedef BOOL (*LPFFINDCODEBYWORDPROC)(unsigned char*, unsigned char*);
//static LPFFINDCODEBYWORDPROC pFindCodeByWordProc;
//
//typedef BOOL (*LPFGENECODEPROC)(unsigned char*, unsigned char*);
//static LPFGENECODEPROC pGeneCodeProc;
//
//typedef BOOL (*LPFNEWWORDPROC)(unsigned char*, unsigned char*);
//static LPFNEWWORDPROC pNewWordProc;
//
//typedef BOOL (*LPFDELETEWORDPROC)(unsigned char*, unsigned char*);
//static LPFDELETEWORDPROC pDeleteWordProc;

static unsigned char codestr[SENTLEN];
static unsigned char wordstr[SENTLEN];
static unsigned char lastwordstr[SENTLEN];		//record wordstr for recovering it if error
static unsigned char corrwordstr[SENTLEN];		//correct word stream
static unsigned char code[CODELEN];
static unsigned char wordlist[(DUPWORD+1)*WORDLEN];		//select word list
static unsigned char codelist[(DUPCODE+1)*CODELEN];		//back search code list 


static int			 codeslen[SENTLEN];			//record each code's length, not used now and refreshed by translate api.
static int			 wordslen[SENTLEN];			//record each word's length in wordstr
static int			 corrwordslen[SENTLEN];		//record each correct-word's length

static int codenum;
static int wordnum;
static int corrwordnum;
static int selwordnum;		//word number in wordlist
static int selcodenum;		//code number in codelist
static int currpos;			//the cursor position
static int lastpos;
static int giPageNo;

static BOOL gbChsSta = TRUE;		//Chinses state
static BOOL gbSBCSta = FALSE;		//SBC case state
static BOOL gbChsPctSta = TRUE;		//Chinses puctuation state
static int  giMaxCodeLen = 4;
static BOOL gbTmpPy = FALSE;		//Chinses state
static int  giCharset = 0;			//GB2312
static BOOL gbFirstQuota = TRUE;	//the last quotation is "”"
static BOOL gbFloatStaWnd = TRUE;		//float state window
static BOOL gbOpenSta = TRUE;

static HWND		ghFocusWnd;
static HANDLE hFile;
static HANDLE* pMem;


//if a character is a punctation keyed in using shift key
static BOOL IsShPct(char c)
{
	if (   c == ',' || c == '.' || c == '/'
		|| c == ';' || c == '\'' 
		|| c == '[' || c == ']' || c == '\\' 
		|| c == '-' || c == '=' || c == '`')
		return FALSE;
	else
		return TRUE;
}

static HWND GetStaWndHandle()
{
	HWND hWnd = 0;

	HANDLE hFile = OpenFileMapping(FILE_MAP_READ, FALSE, "Hook");
	if (hFile)
	{
		HWND *phWnd = (HWND*)MapViewOfFile(hFile, FILE_MAP_READ, 0, 0, sizeof(HANDLE)*4);
		//PostMessage(*phWnd, WM_HOOKKEY, wParam, lParam);
		hWnd = *phWnd;
		
		UnmapViewOfFile(phWnd);  //取消映射
		CloseHandle(hFile);   //关闭内存映射文件

		CString err;
		err.Format("%d", err, hWnd);
		MessageBox(0, err, 0, MB_OK);
	}

	return hWnd;
}

static void Clean()
{
	memset(codestr, 0, sizeof(codestr));
	memset(wordstr, 0, sizeof(wordstr));
	memset(corrwordstr, 0, sizeof(corrwordstr));
	memset(code, 0, sizeof(code));
	memset(codeslen, 0, sizeof(int)*SENTLEN);
	memset(wordslen, 0, sizeof(int)*SENTLEN);
	memset(corrwordslen, 0, sizeof(int)*SENTLEN);
	codenum = 0;
	wordnum = 0;
	corrwordnum = 0;
	selwordnum = 0;
	currpos = -1;
	lastpos = -1;
	giPageNo = 0;

	CHikerWBStateWnd* staWnd;
	staWnd = (CHikerWBStateWnd*)CWnd::FromHandle(GetStaWndHandle());

	staWnd->Clean();
	if (gbFloatStaWnd)
		staWnd->ShowWindow(SW_HIDE);
}

static void PostSent()
{
    if (ghFocusWnd)
	{
		for (int i = 0; i < strlen((char*)wordstr);)
		{
			if (wordstr[i] >= 0x81)	//chinses character
			{
				SendMessage(ghFocusWnd, WM_IME_CHAR, (wordstr[i]<<8)+wordstr[i+1], 0);
				i += 2;
			}
			else
			{
				SendMessage(ghFocusWnd, WM_IME_CHAR, wordstr[i], 0);
				i++;
			}
		}
	}
}

static void PostChar(CString c)
{
//	hWorkWnd = GetForegroundWindow();
//	hThred = GetWindowThreadProcessId(hWorkWnd, 0);
//    if (!AttachThreadInput(GetCurrentThreadId(), hThred, TRUE))
//		return;
//
//    hFocusWnd = GetFocus();
//	if (!hFocusWnd)
//		return;
//    AttachThreadInput(GetCurrentThreadId(), (DWORD)hFocusWnd, FALSE);

    if (ghFocusWnd)
	{
		if (c.GetLength() > 1)
			SendMessage(ghFocusWnd, WM_IME_CHAR, (((unsigned char)c[0])<<8)+(unsigned char)c[1], 0);
		else
			SendMessage(ghFocusWnd, WM_IME_CHAR, c[0], 0);
	}
}

static void PostKey(WPARAM wParam, LPARAM lParam)
{
    if (ghFocusWnd)
	{
		SendMessage(ghFocusWnd, WM_IME_KEYDOWN, wParam, lParam);  //for xp or word on win2k
		SendMessage(ghFocusWnd, WM_KEYDOWN, wParam, lParam);	//for notepad on win2k
	}
}

static unsigned char* LocateCode(int pos)
{
	unsigned char* pcs = codestr;
	unsigned char lc = *pcs++;
	int lenc = (32 != *pcs && 0 != *pcs) ? 1 : 0;
	BOOL bSpcCode = ((lc == 'z')?TRUE:FALSE);

	for (int n = 0; n < pos; pcs++)
	{
		if (32 != *pcs && lc == 32 || (giMaxCodeLen == lenc && !bSpcCode) || (4 == lenc && bSpcCode) || 0 == *pcs)
		{
			lenc = 1;
			n++;
			bSpcCode = ((*pcs == 'z')?TRUE:FALSE);
		}
		else if (32 != *pcs && 0 != *pcs)
		{
			 lenc++;
		}

		lc = *pcs;
	}
	pcs--;

	return pcs;
}

static void InsertCode(unsigned char* pcode, int pos)
{
	unsigned char* pcs = LocateCode(pos);

	int codelen = strlen((char*)pcode);
	int cslen = strlen((char*)codestr);
//	if (32 == pcode[codelen-1])
//		pcode[codelen-1] = 0;
	//strcpy((char*)(pcs + codelen+1), (char*)pcs);
	//strcpy((char*)pcs, (char*)code);		//strcpy will add '\0'
	for (int i = cslen+codelen-1; i >= pcs+codelen-codestr; i--)
		codestr[i] = codestr[i-codelen];
	for (i = 0; i <codelen; i++)
		*(pcs++) = pcode[i];

	codenum++;
}

static void GetCode(int pos, unsigned char* pcode)
{
	memset(pcode, 0, CODELEN);
	if (pos < 0)
		return;
	
	unsigned char* pcs = LocateCode(pos);
	int cdlen = ((*pcs == 'z')?4:giMaxCodeLen);
	for (int n = 0; 32 != *pcs && 0 != *pcs && n < cdlen; pcs++, n++)
	{
		pcode[n] = *pcs;
	}
	pcode[n] = 0;

	if (strlen((char*)pcode) < giMaxCodeLen)
		pcode[strlen((char*)pcode)] = 32;
}

static void DeleteCode(int pos)
{
	if (pos > codenum-1)
		return;

	//find last space character
	unsigned char* pcs0 = LocateCode(pos);
	unsigned char* pcs = pcs0;
	int cslen = strlen((char*)codestr);

	int cdlen = ((*pcs == 'z')?4:giMaxCodeLen);
	for (int i = 0; i < cdlen-1 && 32 != *pcs; i++)
	{
		*pcs++ = 0;
	}
	*pcs = 0;

	int codelen = pcs-pcs0+1;
	for (pcs = pcs0; pcs < codestr+cslen; pcs++)
	{
		*pcs = *(pcs+codelen);
	}

	codenum --;
}

static unsigned char* LocateCorrWord(int pos)
{
	int len = 0;
	for (int n = 0; n < pos; n++)
		len += corrwordslen[n];
	
	return corrwordstr+len;
}

static void InsertCorrWord(unsigned char* pword, int pos)
{
	unsigned char* pws = LocateCorrWord(pos);

	int wordlen = strlen((char*)pword);
	int cwslen = strlen((char*)corrwordstr);
	int i;

	if (wordlen > 0)
	{
		for (i = cwslen+wordlen-1; i >= pws+wordlen-corrwordstr; i--)
			corrwordstr[i] = corrwordstr[i-wordlen];
		for (i = 0; i <wordlen; i++)
			*(pws++) = pword[i];

		corrwordnum++;
	}

	for (i = wordnum+1; i > pos;  i--)
		corrwordslen[i] = corrwordslen[i-1];
	
	corrwordslen[pos] = wordlen;
}

static void DeleteCorrWord(int pos)
{
	unsigned char* pws = LocateCorrWord(pos);
	int wordlen = corrwordslen[pos];
	int cwslen = strlen((char*)corrwordstr);
	int i;

	if (corrwordslen[pos] > 0)
	{
		if (pws + wordlen <  corrwordstr + cwslen)		//not last word
		{
			int iMax = max(cwslen-(pws+wordlen-corrwordstr), wordlen);
			for (int i = 0; i <= iMax; i++)
			{
				*(pws) = *(pws+wordlen);
				*(pws+wordlen) = 0;
				pws++;
			}
		}
		else
		{
			for (i = pws - corrwordstr; i <= cwslen - 1; i++)
			{
				corrwordstr[i] = 0;
			}
		}

		corrwordnum --;
	}

	for (i = pos; i < wordnum+1; i++)		//!note, here the loop uplimit is wordnum, or wordnum+1(if the DeleteWord before DeleteCorrWord), but not corrwordnum.
	{
		corrwordslen[i] = corrwordslen[i+1];
	}
}

static unsigned char* LocateWord(int pos)
{
	int len = 0;
	for (int n = 0; n < pos; n++)
		len += wordslen[n];
	
	return wordstr+len;
}

static void InsertWord(unsigned char* pword, int pos, BOOL bDelCorrWord)
{
	unsigned char* pws = LocateWord(pos);

	int wordlen = strlen((char*)pword);
	int wslen = strlen((char*)wordstr);

	for (int i = wslen + wordlen-1; i >= pws + wordlen - wordstr; i--)
		wordstr[i] = wordstr[i-wordlen];
	for (i = 0; i <wordlen; i++)
		*(pws++) = pword[i];

	wordnum++;

	for (i = wordnum; i > pos; i--)
	{
		wordslen[i] = wordslen[i-1];
	}
	
	wordslen[pos] = wordlen;

	//auto insert empty correct word at this position
	if (bDelCorrWord)
	{
		for (i = wordnum; i > pos; i--)
		{
			corrwordslen[i] = corrwordslen[i-1];
		}
		corrwordslen[pos] = 0;
	}
}

static void DeleteWord(int pos, BOOL bDelCorrWord)
{
	unsigned char* pws = LocateWord(pos);
	int wordlen = wordslen[pos];
	int wslen = strlen((char*)wordstr);
	int i;

	if (pos > wordnum -1)
		return;

	if (pws + wordlen <  wordstr + wslen)		//not last word
	{
		int iMax = max(wslen-(pws+wordlen-wordstr), wordlen);
		for (int i = 0; i <= iMax; i++)
		{
			*(pws) = *(pws+wordlen);
			*(pws+wordlen) = 0;
			pws++;
		}
	}
	else				// the last word
	{
		for (i = pws - wordstr; i <= wslen - 1; i++)
		{
			wordstr[i] = 0;
		}
	}

	//update wordslen array
	for (i = pos; i < wordnum; i++)
	{
		wordslen[i] = wordslen[i+1];
		wordslen[i+1] = 0;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -