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

📄 hikerwbfunc.cpp

📁 自己用Markov模型做的一个整句物笔输入法的原型
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			ai[c] = dTmp;

			d = wi[n];
			wi[n] = wi[c];
			wi[c] = d;

		}
	}

	//get words according to wi and generate select word stream
	unsigned char* pw = pwords;
	wdnum = 0;
	for (n = 0; n < nw; n++)
	{
		POSITION iw = CWFind(code, wi[n]);
		word = CWT.GetAt(iw).word;
		
		if (1 == charset || 0 == charset && IsGB2312(word))
		{
			strcpy((char*)pw, (const char*)word);
			pw += word.GetLength()+1;
			wdnum++;
		}
	}
	//wdnum = nw;

	return TRUE;
}

HKWB_API BOOL GetWordSel(unsigned char* pwords, int wdno, unsigned char* pword)
{
	char lc = 0;
	int iw = 0;
	int wslen = strlen((char*)pwords);
	unsigned char* pw = pwords;
	pw++;

	for (int n = 0; n < wdno; pw++)
	{
		if (*pw != 0 && *(pw-1) == 0)
			n++;
	}
	strcpy((char*)pword, (char*)(pw-1));

	return TRUE;
}

HKWB_API BOOL GetCodes(unsigned char* pword, unsigned char* pcodes, int& cdnum)
{
	POSITION iw = CPFind(CString(pword));
	unsigned char* pc = pcodes;

	cdnum = 0;
	if (iw == 0)
		return FALSE;

	for (POSITION pos = iw; pos && CPT.GetAt(pos).word == CString(pword); CPT.GetNext(pos))
	{
		CString csCode = CPT.GetAt(pos).code;
		strcpy((char*)pc, csCode);
		pc += csCode.GetLength() + 1;
		cdnum ++;
	}

	return TRUE;
}

//get select words in terms of a given pinyin code
HKWB_API BOOL PYGetWords(unsigned char* pycode, unsigned char* pwords, int& wdnum)
{
	PYTItem item;
	unsigned char* pw = pwords;

	wdnum = 0;

	CString code = pycode;
	//transfer a[codeno][.] to ai
	for (POSITION pos = PYIdx[GetCodeId((LPSTR)(LPCSTR)code)]; pos; PYT.GetNext(pos))
	{
		item = PYT.GetAt(pos);
		if (item.code.Left(4) != code.Left(4))
			break;

		if (item.code == code)
		{
			if (1 == charset || 0 == charset && IsGB2312(item.word))
			{
				strcpy((char*)pw, (const char*)item.word);
				pw += item.word.GetLength()+1;
				wdnum++;
			}
		}
	}

	return TRUE;
}

//find a most propably code for a word, unsing only for temporary pinyin
HKWB_API BOOL FindCodeByWord(unsigned char* word, unsigned char* code)
{
	CPTItem item;
	CString csWord = word;
	float maxcp = -1.0;
	BOOL bFound = FALSE;
	memset(code, 0, CODELEN);

	for (POSITION pos = CPFind(word); pos; CPT.GetNext(pos))
	{
		item = CPT.GetAt(pos);
		if (item.word != csWord)
			break;

		if (((maxcodelen == 4)?item.cp:item.cp2) > maxcp && item.code.GetLength() <= maxcodelen)
		{
			bFound = TRUE;
			strcpy((char*)code, (const char*)item.code);
		}
	}

	int len = strlen((char*)code);		//if code not full
	if (len < maxcodelen)
		code[len] = 32;

	return bFound;
}

HKWB_API BOOL InitHook()
{
	InitMB();
	CreateData();
	HookOn();
	SetStyle(0);		//set default output style to traditional style

	return TRUE;
}

HKWB_API void EndHook()
{
	HookOff();
	DeleteData();
	SaveMB();
}

LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
	if (HC_ACTION == code)
	{
		BOOL bCtrlDown = ((GetKeyState(VK_CONTROL) >> 15) != 0);
		BOOL bAltDown = ((GetKeyState(18) >> 15) != 0);
		BOOL bShfDown = ((GetKeyState(VK_SHIFT) >> 15) != 0);

		if (bAltDown)		//if alt key is down, do nothing
			return CallNextHookEx(hHook,code,wParam,lParam);			

		if (!bCtrlDown || bCtrlDown && (wParam >= 50 && wParam <= 55 
			|| wParam == 187 || wParam == 189 || wParam == 190 || wParam == 13))
		{
			if (0 == (lParam>>31) || 0 != (lParam>>31) && 16 == wParam)		//所有按下消息及SHIFT的释放消息
			{
				//MessageBox(NULL, "HikerWB.dll checked a key down and sent WM_KEYHOOK message", "", MB_OK);

				HANDLE hFile = OpenFileMapping(FILE_MAP_WRITE, FALSE, "Hook");
				if (hFile)
				{
					HWND *phWnd = (HWND*)MapViewOfFile(hFile, FILE_MAP_WRITE, 0, 0, sizeof(HANDLE)*5);
					
					if (*(phWnd+1) == 0 && (wParam == 8 || wParam == 46 ||
						wParam == VK_LEFT  || wParam == VK_RIGHT  || wParam == VK_UP || 
						wParam == VK_DOWN || wParam == 33  || wParam == 34 ||
						wParam == VK_HOME  || wParam == VK_END ||
						wParam == VK_RETURN || wParam == VK_ESCAPE || wParam == VK_TAB ))		//编辑窗中无内容且输入为控制键
					{//only for win2k, these keys doesn't work for notepad on win2k by sending message WM_IME_KEYDOWN. why?
						//MessageBox(NULL, "not process", "", MB_OK);
						if (bShfDown && wParam != VK_SHIFT)
							*(phWnd+3) = (HWND)0xFFFFFFFF;		//another key is pushed while shift key down

						UnmapViewOfFile(phWnd);  //取消映射
						CloseHandle(hFile);   //关闭内存映射文件

						return CallNextHookEx(hHook,code,wParam,lParam);
					}

					//MessageBox(NULL, "post", "", MB_OK);
					PostMessage(*phWnd, WM_HOOKKEY, wParam, lParam);
					UnmapViewOfFile(phWnd);  //取消映射
					CloseHandle(hFile);   //关闭内存映射文件
				}

				return 1;
			}
		}
	}

	return CallNextHookEx(hHook,code,wParam,lParam);
}

LRESULT CALLBACK ForegroundIdleProc(int code, WPARAM wParam, LPARAM lParam)
{

	if (HC_ACTION == code)
	{
		CWPRETSTRUCT *msg = (CWPRETSTRUCT *)lParam;
		HANDLE hFile = OpenFileMapping(FILE_MAP_READ, FALSE, "Hook");
		if (hFile)
		{
			HWND *phWnd = (HWND*)MapViewOfFile(hFile, FILE_MAP_READ, 0, 0, 
				sizeof(HANDLE)*3);
	
			//PostMessage(*phWnd, WM_HOOKACT, wParam, lParam);	//post a message for moving state window
			UnmapViewOfFile(phWnd);  //取消映射
			CloseHandle(hFile);   //关闭内存映射文件
		}
	}

	return CallNextHookEx(hHook,code,wParam,lParam);
}

LRESULT CALLBACK CallWndRetProc(int code, WPARAM wParam, LPARAM lParam)
{

	if (HC_ACTION == code)
	{
		CWPRETSTRUCT *msg = (CWPRETSTRUCT *)lParam;
		if (msg->message == WM_ACTIVATE)
		{
			HANDLE hFile = OpenFileMapping(FILE_MAP_READ, FALSE, "Hook");
			if (hFile)
			{
				HWND *phWnd = (HWND*)MapViewOfFile(hFile, FILE_MAP_READ, 0, 0, 
					sizeof(HANDLE)*3);
		
				PostMessage(*phWnd, WM_HOOKACT, wParam, lParam);	//post a message for moving state window
				UnmapViewOfFile(phWnd);  //取消映射
				CloseHandle(hFile);   //关闭内存映射文件
			}
		}
	}

	return CallNextHookEx(hHook,code,wParam,lParam);
}

HKWB_API BOOL HookOn()
{
	//HINSTANCE hInstance = AfxGetInstanceHandle();
	hHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hInst, 0);
	//hHookAct = SetWindowsHookEx(WH_CALLWNDPROCRET, CallWndRetProc, hInst, 0);
	//hHookAct = SetWindowsHookEx(WH_CALLWNDPROCRET, ForegroundIdleProc, hInst, 0);

	return TRUE;
}

HKWB_API BOOL HookOff()
{
	BOOL rVal = UnhookWindowsHookEx(hHook);
	//rVal &= UnhookWindowsHookEx(hHookAct);
	//rVal &= UnhookWindowsHookEx(hHookAct);

	return rVal;
}

//05.11.10
static CSoftKeyboard kb;
HKWB_API BOOL ShowSoftKeyboard(BOOL bShow, int iKeyboardId)
{
	HWND hWnd = kb.GetSafeHwnd();
	if (bShow)
	{
		if (0 == hWnd)
		{
			CDC dc;
			dc.CreateDC("DISPLAY", NULL, NULL, NULL);
			int iw = dc.GetDeviceCaps(HORZRES);
			int ih = dc.GetDeviceCaps(VERTRES);
			dc.DeleteDC();

			CRect rt(iw-448, ih-186, iw-22, ih-31);
			LPCTSTR lpCName = AfxRegisterWndClass(CS_DBLCLKS);
			kb.CreateEx(WS_EX_PALETTEWINDOW|WS_EX_CLIENTEDGE|WS_EX_TOOLWINDOW, lpCName, 
				"softkb", WS_POPUP|WS_OVERLAPPED|WS_DLGFRAME|WS_VISIBLE, rt, NULL, 0);
			kb.m_iKeyboardId = iKeyboardId;
			kb.ShowWindow(SW_SHOW);
		}
		else
		{
			kb.m_iKeyboardId = iKeyboardId;
			kb.ShowWindow(SW_SHOW);
			kb.Invalidate();
		}
	}
	else
	{
		if (0 != hWnd)
		{
			kb.ShowWindow(SW_HIDE);
		}
	}

	return TRUE;
}


//set output style, 0-traditional, 1-my style
HKWB_API void SetStyle(int iStyle)
{
	maxcodelen = (iStyle == 0)?4:2;
}

HKWB_API void SetCharset(int iCharset)
{
	charset = iCharset;
}

//generate code for a new word
HKWB_API BOOL GeneCode(unsigned char* word, unsigned char* code)
{
	CString csWord, csCode, csCode1, csCode2, csCode3, csCode4;

	csWord = word;
	int lenw = csWord.GetLength();
	if (lenw == 4 || lenw == 6 || lenw == 8 || lenw == 10 || lenw == 12 || lenw == 14)
	{
		if (4 == lenw)
		{
			Find2CCode(csWord.Left(2), csCode1);
			Find2CCode(csWord.Right(2), csCode2);
			csCode = csCode1+csCode2;
		}
		else if (6 == lenw)
		{
			Find1CCode(csWord.Left(2), csCode1);
			Find1CCode(csWord.Mid(2, 2), csCode2);
			Find2CCode(csWord.Right(2), csCode3);
			csCode = csCode1+csCode2+csCode3;
		}
		else if (8 <= lenw)
		{
			Find1CCode(csWord.Left(2), csCode1);
			Find1CCode(csWord.Mid(2, 2), csCode2);
			Find1CCode(csWord.Mid(4, 2), csCode3);
			Find1CCode(csWord.Right(2), csCode4);
			csCode = csCode1+csCode2+csCode3+csCode4;
		}
		strcpy((char*)code, (LPCSTR)csCode);

		return TRUE;
	}
	else
		return FALSE;
}

HKWB_API BOOL NewWord(unsigned char* code, unsigned char* word)
{
	CTItem itemc;
	POSITION pos;
	CString csCap;
	AfxGetMainWnd()->GetWindowText(csCap);
	int idc = GetCodeId((char*)code);

	//add word
	if (!WLocate(word, pos))
	{
		if (pos)
		{
			WT.InsertAfter(pos, WTItem(word, PPINC));
		}
		else
		{
			WT.AddTail(WTItem(word, PPINC));
		}
		sumwordfre += PPINC;
	}
	else
	{
		MessageBox(NULL, "该词已存在!", csCap, MB_OK|MB_ICONSTOP|MB_TOPMOST);
		return FALSE;
	}

	//add code
	pos= CFind(code);
	if (!pos)
	{
		CIdx[idc] = CT.AddTail(CTItem(code, 1, 0));
	}
	else
	{
		itemc = CT.GetAt(pos);
		itemc.wnum ++;
		CT.SetAt(pos, itemc);
	}

	//add code-word item
	if (!CWLocate(code, word, pos))
	{
		if (pos)
		{
			CWT.InsertAfter(pos, CWTItem(code, word));
		}
		else
		{
			CWIdx[idc] = CWT.AddTail(CWTItem(code, word));
		}
	}

	if (!CPLocate(word, code, pos))
	{
		if (pos)
		{
			CPT.InsertAfter(pos, CPTItem(word, code, 1.0, 0.0));
		}
		else
		{
			CPT.AddTail(CPTItem(word, code, 1.0, 0.0));
		}
	}

	return TRUE;
}

HKWB_API BOOL DeleteWord(unsigned char* code, unsigned char* word)
{
	CTItem itemc;
	POSITION pos;
	CString csCap;
	AfxGetMainWnd()->GetWindowText(csCap);
	int idc = GetCodeId((char*)code);

	if (strlen((char*)word) < 2)
	{
		MessageBox(NULL, "不能删除该词!", csCap, MB_OK|MB_ICONSTOP|MB_TOPMOST);
		return FALSE;
	}

	//delete word
	if (WLocate(word, pos))
	{
		WTItem itemw = WT.GetAt(pos);
		WT.RemoveAt(pos);
		sumwordfre -= itemw.prior;
	}
	else
	{
		MessageBox(NULL, "该词不存在!", csCap, MB_OK|MB_ICONSTOP|MB_TOPMOST);
		return FALSE;
	}

	//add code
	pos= CFind(code);
	if (pos)
	{
		itemc = CT.GetAt(pos);
		itemc.wnum --;
		if (itemc.wnum == 0)
		{
			CT.RemoveAt(pos);
			CIdx[idc] = 0;
		}
		else
		{
			CT.SetAt(pos, itemc);
		}
	}

	//add code-word item
	if (CWLocate(code, word, pos))
	{
		CWT.RemoveAt(pos);
		if (pos == CWIdx[idc])
		{
			CWIdx[idc] = 0;
		}
	}

	if (CPLocate(word, code, pos))
	{
		CPT.RemoveAt(pos);
	}

//	if (TPLocate(word, code, pos))
//	{
//		CPT.InsertAfter(pos, CPTItem(word, code, 1.0, 0.0));
//	}

	return TRUE;
}

HKWB_API BOOL TrainFromFile(const char* pFileName)
{
	unsigned char buffw[3];
	CString code, word, wordc;
	WTItem itemw;
	TPTItem itemtp, itemtp0;
	int transwdnum;
	POSITION pos, pos0;
	double delta, tpsum, dlt;

	CFile file;
	CString csCap;

	AfxGetMainWnd()->GetWindowText(csCap);

	if (!file.Open(pFileName, CFile::modeRead))
		MessageBox(NULL, "打开学习文章失败!", csCap, MB_OK|MB_ICONSTOP);

	int flen = file.GetLength();

	//create file map
	HANDLE hfile = CreateFileMapping((HANDLE)file.m_hFile, NULL, PAGE_READONLY, 0, 0, 0);
	LPBYTE lpf = (LPBYTE)MapViewOfFile(hfile, FILE_MAP_READ, 0, 0, 0);
	
	CProgWnd *progWnd = CreateProgWnd();
	CString csShowFileName;
	csShowFileName = pFileName;
	
	for (;;)
	{
		int loc = csShowFileName.Find('\\');
		if (loc >= 0)
		{
			int len = csShowFileName.GetLength();
			csShowFileName= csShowFileName.Right(len-1-loc);
		}
		else
			break;
	}
	if (csShowFileName.GetLength() > 20)
		csShowFileName = csShowFileName.Left(17)+"...";
	progWnd->SetMessage("正在从文章“"+ csShowFileName +"”学习");
	progWnd->SetRange(flen);
	progWnd->SetStep(1);

	word = "";
	for (int n = 0; n < flen; )
	{
		if (*lpf >= 0x81)		//chinese character
		{
			buffw[0] = *lpf++;
			buffw[1] = *lpf++;
			buffw[2] = 0;
			n += 2;
			progWnd->StepIt();
			progWnd->StepIt();
		}
		else
		{
			buffw[0] = *lpf++;
			buffw[1] = 0;
			n ++;
			progWnd->StepIt();
		}
		wordc = CString(buffw);
		pos = WFind(wordc);

		//calculate prior sum for this code's all words
		if (pos)
		{
			itemw = WT.GetAt(pos);
			itemw.prior ++;
			WT.SetAt(pos, itemw);
		}

		//update transition probabilities
		if (word != "")
		{
			if (TPFind(word) != 0)				//the lastword-word item exist in TPmap table
			{
				pos0 = TPFind(word, wordc);
				if (pos0)
					itemtp0 = TPT.GetAt(pos0);
				else
				{
					itemtp0.word = word;
					itemtp0.wordc = wordc;
					itemtp0.tp = 0.0;
				}

				tpsum = TPSum(word, transwdnum);
				delta = (((itemtp0.tp+TPINC) < TPSUMLMT) ? TPINC : TPSUMLMT-itemtp0.tp);
				dlt = tpsum+delta-TPSUMLMT;

				//adjust all existing item's tp
				if (dlt > 0.0)
				{
					pos = TPFind(word);
					for (; pos; TPT.GetNext(pos))
					{
						itemtp = TPT.GetAt(pos);
						if (itemtp.word != word)
							break;

						itemtp.tp -= itemtp.tp/tpsum*dlt;
						ASSERT(itemtp.tp > 0);
						TPT.SetAt(pos, itemtp);
					}
				}
				
				if (pos0)		//refresh itemtp0
					itemtp0 = TPT.GetAt(pos0);
				itemtp0.tp += delta;
				ASSERT(itemtp0.tp > 0);
				if (pos0)
					TPT.SetAt(pos0, itemtp0);
				else
				{
					pos = TPFind(word);			//locate the last word-wordc item
					for (; pos; TPT.GetNext(pos))
					{
						if (TPT.GetAt(pos).word != word)
							break;
					}
					if (pos)		//the above loop are breaked, this means the pos is not the end of Word-word table
						TPT.InsertBefore(pos, itemtp0);
					else
						TPT.AddTail(itemtp0);
				}
				ASSERT(TPSum(word, transwdnum) <= TPSUMLMT+1e-5);
			}
			else
			{
				itemtp0.word = word;
				itemtp0.wordc = wordc;
				itemtp0.tp = TPINC;
				pos = TPT.AddTail(itemtp0);
				TPIdx[GetWordId((LPSTR)(LPCSTR)word)] = pos;
			}
		}

		word = wordc;
	}

	UnmapViewOfFile(lpf);
	CloseHandle(hfile);
	file.Close();

	DeleteProgWnd(progWnd);

	return TRUE;
}

HKWB_API void SetKeyProcSign(BOOL bSign)
{
	gbKeyProcSign = bSign;
}

HKWB_API HANDLE GetThreadHandle()
{
	return ghThread;
}

⌨️ 快捷键说明

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