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

📄 srhword.c

📁 屏幕取词源码.zip
💻 C
📖 第 1 页 / 共 3 页
字号:
        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 + -