📄 srhword.c
字号:
g_hNotifyWnd = hNotifyWnd;
g_CurMousePos.x = MouseX;
g_CurMousePos.y = MouseY;
return BL_OK;
}
DWORD FAR PASCAL _export BL_GetBuffer16(LPSTR lpszBuffer, short nBufferSize, LPWORDRECT lpWr)
{
int len;
char* pcFirstSpacePos = NULL ; //position of first space
char* pcTemp = NULL ;
int nSrc = 0, nDest = 0 ;
if (!g_bMouseInTotalWord)
{
#ifdef _DEBUG
DbgPrintf("NhWSrh.DLL GetBuffer: Caret not in word, clear buffer.");
#endif
g_szTotalWord[0] = 0x00;
g_nCurCaretPlaceInTotalWord = -1;
}
if ((len = strlen(g_szTotalWord)) >= nBufferSize)
{
len = nBufferSize - 1;
}
//Modified by XGL, Oct 28th, 1998
//In IE4, cannot get correct Chinese word,
//so we have to use former version for Chinese word
/* //Added by XGL, Sep 29th, 1998
if (g_nPhraseCharType == CHAR_TYPE_HZ)
{
//get the word before the first space
if (pcFirstSpacePos = strchr(g_szTotalWord, ' '))
{
len = pcFirstSpacePos - g_szTotalWord ;
}
}
*/
//remove tail space(s)
while ((g_szTotalWord[len - 1] == ' ') && (len > 0))
{
len-- ;
g_szTotalWord[len] == 0x00 ;
}
//Adding ends.
//Modified by xgl, Oct 26th, 1998
//for English, we combine spaces between words to one
//we do it by copying chars one by one
//strncpy will no longer be used
if (g_szTotalWord[0] < 0)
{
strncpy(lpszBuffer, g_szTotalWord, len);
lpszBuffer[len] = 0x00;
lpWr->left = g_TotalWordRect.left;
lpWr->right = g_TotalWordRect.right;
lpWr->top = g_TotalWordRect.top;
lpWr->bottom = g_TotalWordRect.bottom;
}
else
{
if (g_szTotalWord[0] == ' ')
{
//this conditions should not happen.
strncpy(lpszBuffer, g_szTotalWord, len);
lpszBuffer[len] = 0x00;
}
else
{
while (nSrc < len)
{
lpszBuffer[nDest] = g_szTotalWord[nSrc] ;
nDest++ ;
nSrc++ ;
if (g_szTotalWord[nSrc] == ' ' && nSrc < len)
{
lpszBuffer[nDest] = g_szTotalWord[nSrc] ;
nDest++ ;
nSrc++ ;
while (g_szTotalWord[nSrc] == ' ' && nSrc < len)
{
nSrc++ ;
}
}
}
}
//strncpy(lpszBuffer, g_szTotalWord, len);
lpszBuffer[len] = 0x00;
lpWr->left = g_rcFirstWordRect.left;
lpWr->right = g_rcFirstWordRect.right;
lpWr->top = g_rcFirstWordRect.top;
lpWr->bottom = g_rcFirstWordRect.bottom;
}
//Modification ends. xgl, Oct 26th, 1998
#ifdef _DEBUG
// DbgPrintf("NhWSrh.DLL g_szCurWord: %s", g_szCurWord);
// DbgPrintf("NhWSrh.DLL Rect l: %d, r: %d, t: %d, b: %d",
// g_CurWordRect.left,
// g_CurWordRect.right,
// g_CurWordRect.top,
// g_CurWordRect.bottom);
DbgPrintf("NhWSrh.DLL return caret place: %d", g_nCurCaretPlaceInTotalWord);
DbgPrintf("NhWSrh.DLL g_szTotalWord: %s", g_szTotalWord);
DbgPrintf("NhWSrh.DLL Rect l: %d, r: %d, t: %d, b: %d",
g_TotalWordRect.left,
g_TotalWordRect.right,
g_TotalWordRect.top,
g_TotalWordRect.bottom);
#endif
#ifdef _DEBUG
DbgPrintf("NhWSrh.DLL ***************** End *****************************");
#endif
return (DWORD)g_nCurCaretPlaceInTotalWord;
}
// Hook TextOut and TextOutEx.
DWORD FAR PASCAL _export BL_HookWinApi16()
{
g_nCurCaretPlace = -1;
g_szCurWord[0] = 0x00;
g_szTotalWord[0] = 0x00;
g_nCurCaretPlaceInTotalWord = -1;
g_CharType = CHAR_TYPE_OTHER;
g_bMouseInTotalWord = FALSE;
g_bAllowGetCurWord = TRUE;
nWordNum = 0;
szMemDCWordBuff[0] = 0x00;
HookAllTextOut();
return BL_OK;
}
// UnHook TextOut and TextOutEx.
DWORD FAR PASCAL _export BL_UnHookWinApi16()
{
g_bAllowGetCurWord = FALSE;
UnHookAllTextOut();
return BL_OK;
}
BOOL bHooked = FALSE;
// Use to hook "TextOut" and "ExtTextOut"
void HookAllTextOut()
{
#ifdef _DEBUG
DbgPrintf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`hook\n");
#endif
if (bHooked)
{
return;
}
bHooked = TRUE;
HookWinApi(&g_BitBltHook, HOOKANDBACK);
HookWinApi(&g_TextOutHook, HOOKANDBACK);
HookWinApi(&g_ExtTextOutHook, HOOKANDBACK);
}
// Use to restore "TextOut" and "ExtTextOut"
void UnHookAllTextOut()
{
#ifdef _DEBUG
DbgPrintf("|~~~~~~~~~~~~~~~~~~~~~~~unhook~~~~~~~~~\n") ;
#endif
RestoreWinApi(&g_TextOutHook);
RestoreWinApi(&g_ExtTextOutHook);
RestoreWinApi(&g_BitBltHook);
bHooked = FALSE;
}
BOOL WINAPI _export BLTextOut(HDC hDC,int x,int y,LPCSTR lpStr,int cbLen)
{
POINT pt ;
HWND hWDC ;
HWND hWPT ;
#ifdef _DEBUG
DbgPrintf("NhWSrh.DLL BLTextOut Begin");
DbgPrintf("NhWSrh.DLL BLTextOut hDC: %d", hDC);
DbgPrintf("NhWSrh.DLL BLTextOut hDC: %d, x: %d, y: %d, cbLen: %d",
hDC,
x,
y,
cbLen);
#endif
// restore the old textout.
RestoreWinApi(&g_TextOutHook);
//Added by XGL, Nov 3rd, 1998
//We cannot get corret word with Explorer as background window
//in Windows98, so this situation must be dealt with.
pt.x = g_CurMousePos.x; pt.y = g_CurMousePos.y ;
hWDC = WindowFromDC(hDC) ;
hWPT = WindowFromPoint(pt) ;
if (hWDC == NULL || hWPT == hWDC
|| IsParentOrSelf(hWPT, hWDC)
|| IsParentOrSelf(hWDC, hWPT))
{
//Adding ends. XGL, Nov 3rd, 1998
if ((g_bAllowGetCurWord) && (!IsBadReadPtr(lpStr, cbLen)) && (cbLen > 0))
{
g_nTextAlign = GetTextAlign(hDC);
g_nExtra = GetTextCharacterExtra(hDC);
GetCurrentPositionEx(hDC, &g_CurPos);
GetTextMetrics(hDC, &g_tm);
///////////////////////////////////////////////////////////////////////////
// Modify by Yan/Gang 1997/11/18
// 用於修改在计算 TA_CENTER 情况的失误。
g_dwDCOrg = 0;
bRecAllRect = FALSE;
GetStringRect(hDC, (LPSTR)lpStr, cbLen, x, y, &g_rcTotalRect, NULL);
bRecAllRect = TRUE;
// End Modify
///////////////////////////////////////////////////////////////////////////
if ((WindowFromDC != NULL)&&(WindowFromDC(hDC) == NULL))
{
#ifdef _DEBUG
DbgPrintf("NhWSrh.DLL BLTextOut WindowFromDC() = NULL, string add to TextOutBuffer");
DbgLPCSTR("NhWSrh.DLL BLTextOut ", (LPSTR)lpStr, cbLen, TRUE);
#endif
// 赋零,用於避免MEMDC对串位置的影响·
g_dwDCOrg = 0;
AddToTextOutBuffer(hDC, (LPSTR)lpStr, cbLen, x, y, NULL);
}
else
{
#ifdef _DEBUG
DbgPrintf("NhWSrh.DLL BLTextOut WindowFromDC() != NULL, string add to TextOutBuffer");
DbgLPCSTR("NhWSrh.DLL BLTextOut ", (LPSTR)lpStr, cbLen, TRUE);
#endif
g_dwDCOrg = GetDCOrg(hDC);
GetCurMousePosWord(hDC, (LPSTR)lpStr, cbLen, x, y, NULL);
}
}
else
{
#ifdef _DEBUG
DbgPrintf("NhWSrh.DLL BLTextOut ((!g_bAllowGetCurWord) || (IsBadReadPtr(lpStr, cbLen)) && (cbLen <= 0))");
if (!g_bAllowGetCurWord)
{
DbgPrintf("NhWSrh.DLL BLTextOut !g_bAllowGetCurWord");
}
if (IsBadReadPtr(lpStr, cbLen))
{
DbgPrintf("NhWSrh.DLL BLTextOut IsBadReadPtr()");
}
if (cbLen <= 0)
{
DbgPrintf("NhWSrh.DLL BLTextOut cbLen <= 0");
}
#endif
}
}
// call old textout.
TextOut(hDC, x, y, lpStr, cbLen);
HookWinApi(&g_TextOutHook, ONLYHOOK);
#ifdef _DEBUG
DbgPrintf("NhWSrh.DLL BLTextOut End");
#endif
return (TRUE);
}
BOOL WINAPI _export BLExtTextOut(HDC hDC,
int x,
int y,
UINT fuOpt,
const RECT FAR* lprc,
LPCSTR lpStr,
UINT cbLen,
int FAR* lpDx)
{
POINT pt ;
HWND hWDC ;
HWND hWPT ;
#ifdef _DEBUG
DbgPrintf("NhWSrh.DLL BLExtTextOut Begin");
DbgPrintf("NhWSrh.DLL BLExtTextOut hDC: %d, x: %d, y: %d, fuOpt: %d, cbLen: %d",
hDC,
x,
y,
fuOpt,
cbLen);
#endif
// restore the old textout.
RestoreWinApi(&g_ExtTextOutHook);
//Added by XGL, Nov 3rd, 1998
//We cannot get corret word with Explorer as background window
//in Windows98, so this situation must be dealt with.
pt.x = g_CurMousePos.x; pt.y = g_CurMousePos.y ;
hWDC = WindowFromDC(hDC) ;
hWPT = WindowFromPoint(pt) ;
if (hWDC == NULL || hWPT == hWDC
|| IsParentOrSelf(hWPT, hWDC)
|| IsParentOrSelf(hWDC, hWPT))
{
//Adding ends. XGL, Nov 3rd, 1998
if ((g_bAllowGetCurWord) && (!IsBadReadPtr(lpStr, cbLen)) && (cbLen > 0))
{
g_nTextAlign = GetTextAlign(hDC);
g_nExtra = GetTextCharacterExtra(hDC);
GetCurrentPositionEx(hDC, &g_CurPos);
GetTextMetrics(hDC, &g_tm);
///////////////////////////////////////////////////////////////////////////
// Modify by Yan/Gang 1997/11/18
// 用於修改在计算 TA_CENTER 情况的失误。
g_dwDCOrg = 0;
bRecAllRect = FALSE;
GetStringRect(hDC, (LPSTR)lpStr, cbLen, x, y, &g_rcTotalRect, lpDx);
bRecAllRect = TRUE;
// End Modify
///////////////////////////////////////////////////////////////////////////
if ((WindowFromDC != NULL)&&(WindowFromDC(hDC) == NULL))
{
#ifdef _DEBUG
DbgPrintf("NhWSrh.DLL BLTextOut WindowFromDC() == NULL");
DbgLPCSTR("NhWSrh.DLL BLTextOut: ", (LPSTR)lpStr, cbLen, TRUE);
#endif
// 赋零,用於避免MEMDC对串位置的影响·
g_dwDCOrg = 0;
AddToTextOutBuffer(hDC, (LPSTR)lpStr, cbLen, x, y, lpDx);
}
else
{
#ifdef _DEBUG
DbgPrintf("NhWSrh.DLL BLTextOut WindowFromDC() != NULL");
DbgLPCSTR("NhWSrh.DLL BLTextOut: ", (LPSTR)lpStr, cbLen, TRUE);
#endif
g_dwDCOrg = GetDCOrg(hDC);
GetCurMousePosWord(hDC, (LPSTR)lpStr, cbLen, x, y, lpDx);
}
}
else
{
#ifdef _DEBUG
DbgPrintf("NhWSrh.DLL BLExtTextOut ((!g_bAllowGetCurWord) || (IsBadReadPtr(lpStr, cbLen)) && (cbLen <= 0))");
if (!g_bAllowGetCurWord)
{
DbgPrintf("NhWSrh.DLL BLExtTextOut !g_bAllowGetCurWord");
}
if (IsBadReadPtr(lpStr, cbLen))
{
DbgPrintf("NhWSrh.DLL BLExtTextOut IsBadReadPtr()");
}
if (cbLen <= 0)
{
DbgPrintf("NhWSrh.DLL BLExtTextOut cbLen <= 0");
}
#endif
}
}
// call old textout.
ExtTextOut(hDC, x, y, fuOpt, lprc, lpStr, cbLen, lpDx);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -