📄 hikerwbfunc.cpp
字号:
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 + -