A. 屏幕取詞
「滑鼠屏幕取詞」技術是在電子字典中得到廣泛地應用的,如四通利方和金山詞霸等軟體,這個技術看似簡單,其實在WINDOWS系統中實現卻是非常復雜的,總的來說有兩種實現方式:
第一種:採用截獲對部分GDI的API調用來實現,如TextOut,TextOutA等。
第二種:對每個設備上下文(DC)做一分Copy,並跟蹤所有修改上下文(DC)的操作。
第二種方法更強大,但兼容性不好,而第一種方法使用的截獲WindowsAPI的調用,這項技術的強大可能遠遠超出了您的想像,毫不誇張的說,利用WindowsAPI攔截技術,你可以改造整個操作系統,事實上很多外掛式Windows中文平台就是這么實現的!而這項技術也正是這篇文章的主題。
截WindowsAPI的調用,具體的說來也可以分為兩種方法:
第一種方法通過直接改寫WinAPI 在內存中的映像,嵌入匯編代碼,使之被調用時跳轉到指定的地址運行來截獲;第二種方法則改寫IAT(Import Address Table 輸入地址表),重定向WinAPI函數的調用來實現對WinAPI的截獲。
第一種方法的實現較為繁瑣,而且在Win95、98下面更有難度,這是因為雖然微軟說WIN16的API只是為了兼容性才保留下來,程序員應該盡可能地調用32位的API,實際上根本就不是這樣!WIN 9X內部的大部分32位API經過變換調用了同名的16位API,也就是說我們需要在攔截的函數中嵌入16位匯編代碼!
我們將要介紹的是第二種攔截方法,這種方法在Win95、98和NT下面運行都比較穩定,兼容性較好。由於需要用到關於Windows虛擬內存的管理、打破進程邊界牆、向應用程序的進程空間中注入代碼、PE(Portable Executable)文件格式和IAT(輸入地址表)等較底層的知識,所以我們先對涉及到的這些知識大概地做一個介紹,最後會給出攔截部分的關鍵代碼。
先說Windows虛擬內存的管理。Windows9X給每一個進程分配了4GB的地址空間,對於NT來說,這個數字是2GB,系統保留了2GB到 4GB之間的地址空間禁止進程訪問,而在Win9X中,2GB到4GB這部分虛擬地址空間實際上是由所有的WIN32進程所共享的,這部分地址空間載入了共享Win32 DLL、內存映射文件和VXD、內存管理器和文件系統碼,Win9X中這部分對於每一個進程都是可見的,這也是Win9X操作系統不夠健壯的原因。
Win9X中為16位操作系統保留了0到4MB的地址空間,而在4MB到2GB之間也就是Win32進程私有的地址空間,由於 每個進程的地址空間都是相對獨立的,也就是說,如果程序想截獲其它進程中的API調用,就必須打破進程邊界牆,向其它的進程中注入截獲API調用的代碼,這項工作我們交給鉤子函數(SetWindowsHookEx)來完成,關於如何創建一個包含系統鉤子的動態鏈接庫,《電腦高手雜志》已經有過專題介紹了,這里就不贅述了。
所有系統鉤子的函數必須要在動態庫里,這樣的話,當進程隱式或顯式調用一個動態庫里的函數時,系統會把這個動態庫映射到這個進程的虛擬地址空間里,這使得DLL成為進程的一部分,以這個進程的身份執行,使用這個進程的堆棧,也就是說動態鏈接庫中的代碼被鉤子函數注入了其它GUI進程的地址空間(非GUI進程,鉤子函數就無能為力了),當包含鉤子的DLL注入其它進程後,就可以取得映射到這個進程虛擬內存里的各個模塊(EXE和DLL)的基地址,如:
HMODULE hmole=GetMoleHandle(「Mypro.exe」);
在MFC程序中,我們可以用AfxGetInstanceHandle()函數來得到模塊的基地址。EXE和DLL被映射到虛擬內存空間的什麼地方是由它們的基地址決定的。它們的基地址是在鏈接時由鏈接器決定的。當你新建一個Win32工程時,VC++鏈接器使用預設的基地址0x00400000。可以通過鏈接器的BASE選項改變模塊的基地址。EXE通常被映射到虛擬內存的0x00400000處,DLL也隨之有不同的基地址,通常被映射到不同進程的相同的虛擬地址空間處。
系統將EXE和DLL原封不動映射到虛擬內存空間中,它們在內存中的結構與磁碟上的靜態文件結構是一樣的。即PE (Portable Executable) 文件格式。我們得到了進程模塊的基地址以後,就可以根據PE文件的格式窮舉這個模塊的IMAGE_IMPORT_DESCRIPTOR數組,看看進程空間中是否引入了我們需要截獲的函數所在的動態鏈接庫,比如需要截獲「TextOutA」,就必須檢查「Gdi32.dll」是否被引入了。
說到這里,我們有必要介紹一下PE文件的格式,如右圖,這是PE文件格式的大致框圖,最前面是文件頭,我們不必理會,從PE File Optional Header後面開始,就是文件中各個段的說明,說明後面才是真正的段數據,而實際上我們關心的只有一個段,那就是「.idata」段,這個段中包含了所有的引入函數信息,還有IAT(Import Address Table)的RVA(Relative Virtual Address)地址。
說到這里,截獲WindowsAPI的整個原理就要真相大白了。實際上所有進程對給定的API函數的調用總是通過PE文件的一個地方來轉移的,這就是一個該模塊(可以是EXE或DLL)的「.idata」段中的IAT輸入地址表(Import Address Table)。在那裡有所有本模塊調用的其它DLL的函數名及地址。對其它DLL的函數調用實際上只是跳轉到輸入地址表,由輸入地址表再跳轉到DLL真正的函數入口。
具體來說,我們將通過IMAGE_IMPORT_DESCRIPTOR數組來訪問「.idata」段中引入的DLL的信息,然後通過IMAGE_THUNK_DATA數組來針對一個被引入的DLL訪問該DLL中被引入的每個函數的信息,找到我們需要截獲的函數的跳轉地址,然後改成我們自己的函數的地址……具體的做法在後面的關鍵代碼中會有詳細的講解。
講了這么多原理,現在讓我們回到「滑鼠屏幕取詞」的專題上來。除了API函數的截獲,要實現「滑鼠屏幕取詞」,還需要做一些其它的工作,簡單的說來,可以把一個完整的取詞過程歸納成以下幾個步驟:
1. 安裝滑鼠鉤子,通過鉤子函數獲得滑鼠消息。
使用到的API函數:SetWindowsHookEx
2. 得到滑鼠的當前位置,向滑鼠下的窗口發重畫消息,讓它調用系統函數重畫窗口。
使用到的API函數:WindowFromPoint,ScreenToClient,InvalidateRect
3. 截獲對系統函數的調用,取得參數,也就是我們要取的詞。
對於大多數的Windows應用程序來說,如果要取詞,我們需要截獲的是「Gdi32.dll」中的「TextOutA」函數。
我們先仿照TextOutA函數寫一個自己的MyTextOutA函數,如:
BOOL WINAPI MyTextOutA(HDC hdc, int nXStart, int nYStart, LPCSTR lpszString,int cbString)
{
// 這里進行輸出lpszString的處理
// 然後調用正版的TextOutA函數
}
把這個函數放在安裝了鉤子的動態連接庫中,然後調用我們最後給出的HookImportFunction函數來截獲進程對TextOutA函數的調用,跳轉到我們的MyTextOutA函數,完成對輸出字元串的捕捉。
HookImportFunction的用法:
HOOKFUNCDESC hd;
PROC pOrigFuns;
hd.szFunc="TextOutA";
hd.pProc=(PROC)MyTextOutA;
HookImportFunction (AfxGetInstanceHandle(),"gdi32.dll",&hd,pOrigFuns);
下面給出了HookImportFunction的源代碼,相信詳盡的注釋一定不會讓您覺得理解截獲到底是怎麼實現的很難,Ok,Let』s Go:
///////////////////////////////////////////// Begin ///////////////////////////////////////////////////////////////
#include <crtdbg.h>
// 這里定義了一個產生指針的宏
#define MakePtr(cast, ptr, AddValue) (cast)((DWORD)(ptr)+(DWORD)(AddValue))
// 定義了HOOKFUNCDESC結構,我們用這個結構作為參數傳給HookImportFunction函數
typedef struct tag_HOOKFUNCDESC
{
LPCSTR szFunc; // The name of the function to hook.
PROC pProc; // The procere to blast in.
} HOOKFUNCDESC , * LPHOOKFUNCDESC;
// 這個函數監測當前系統是否是WindowNT
BOOL IsNT();
// 這個函數得到hMole -- 即我們需要截獲的函數所在的DLL模塊的引入描述符(import descriptor)
PIMAGE_IMPORT_DESCRIPTOR GetNamedImportDescriptor(HMODULE hMole, LPCSTR szImportMole);
// 我們的主函數
BOOL HookImportFunction(HMODULE hMole, LPCSTR szImportMole,
LPHOOKFUNCDESC paHookFunc, PROC* paOrigFuncs)
{
/////////////////////// 下面的代碼檢測參數的有效性 ////////////////////////////
_ASSERT(szImportMole);
_ASSERT(!IsBadReadPtr(paHookFunc, sizeof(HOOKFUNCDESC)));
#ifdef _DEBUG
if (paOrigFuncs) _ASSERT(!IsBadWritePtr(paOrigFuncs, sizeof(PROC)));
_ASSERT(paHookFunc.szFunc);
_ASSERT(*paHookFunc.szFunc != '\0');
_ASSERT(!IsBadCodePtr(paHookFunc.pProc));
#endif
if ((szImportMole == NULL) || (IsBadReadPtr(paHookFunc, sizeof(HOOKFUNCDESC))))
{
_ASSERT(FALSE);
SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);
return FALSE;
}
//////////////////////////////////////////////////////////////////////////////
// 監測當前模塊是否是在2GB虛擬內存空間之上
// 這部分的地址內存是屬於Win32進程共享的
if (!IsNT() && ((DWORD)hMole >= 0x80000000))
{
_ASSERT(FALSE);
SetLastErrorEx(ERROR_INVALID_HANDLE, SLE_ERROR);
return FALSE;
}
// 清零
if (paOrigFuncs) memset(paOrigFuncs, NULL, sizeof(PROC));
// 調用GetNamedImportDescriptor()函數,來得到hMole -- 即我們需要
// 截獲的函數所在的DLL模塊的引入描述符(import descriptor)
PIMAGE_IMPORT_DESCRIPTOR pImportDesc = GetNamedImportDescriptor(hMole, szImportMole);
if (pImportDesc == NULL)
return FALSE; // 若為空,則模塊未被當前進程所引入
// 從DLL模塊中得到原始的THUNK信息,因為pImportDesc->FirstThunk數組中的原始信息已經
// 在應用程序引入該DLL時覆蓋上了所有的引入信息,所以我們需要通過取得pImportDesc->OriginalFirstThunk
// 指針來訪問引入函數名等信息
PIMAGE_THUNK_DATA pOrigThunk = MakePtr(PIMAGE_THUNK_DATA, hMole,
pImportDesc->OriginalFirstThunk);
// 從pImportDesc->FirstThunk得到IMAGE_THUNK_DATA數組的指針,由於這里在DLL被引入時已經填充了
// 所有的引入信息,所以真正的截獲實際上正是在這里進行的
PIMAGE_THUNK_DATA pRealThunk = MakePtr(PIMAGE_THUNK_DATA, hMole, pImportDesc->FirstThunk);
// 窮舉IMAGE_THUNK_DATA數組,尋找我們需要截獲的函數,這是最關鍵的部分!
while (pOrigThunk->u1.Function)
{
// 只尋找那些按函數名而不是序號引入的函數
if (IMAGE_ORDINAL_FLAG != (pOrigThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG))
{
// 得到引入函數的函數名
PIMAGE_IMPORT_BY_NAME pByName = MakePtr(PIMAGE_IMPORT_BY_NAME, hMole,
pOrigThunk->u1.AddressOfData);
// 如果函數名以NULL開始,跳過,繼續下一個函數
if ('\0' == pByName->Name[0])
continue;
// bDoHook用來檢查是否截獲成功
BOOL bDoHook = FALSE;
// 檢查是否當前函數是我們需要截獲的函數
if ((paHookFunc.szFunc[0] == pByName->Name[0]) &&
(strcmpi(paHookFunc.szFunc, (char*)pByName->Name) == 0))
{
// 找到了!
if (paHookFunc.pProc)
bDoHook = TRUE;
}
if (bDoHook)
{
// 我們已經找到了所要截獲的函數,那麼就開始動手吧
// 首先要做的是改變這一塊虛擬內存的內存保護狀態,讓我們可以自由存取
MEMORY_BASIC_INFORMATION mbi_thunk;
VirtualQuery(pRealThunk, &mbi_thunk, sizeof(MEMORY_BASIC_INFORMATION));
_ASSERT(VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize,
PAGE_READWRITE, &mbi_thunk.Protect));
// 保存我們所要截獲的函數的正確跳轉地址
if (paOrigFuncs)
paOrigFuncs = (PROC)pRealThunk->u1.Function;
// 將IMAGE_THUNK_DATA數組中的函數跳轉地址改寫為我們自己的函數地址!
// 以後所有進程對這個系統函數的所有調用都將成為對我們自己編寫的函數的調用
pRealThunk->u1.Function = (PDWORD)paHookFunc.pProc;
// 操作完畢!將這一塊虛擬內存改回原來的保護狀態
DWORD dwOldProtect;
_ASSERT(VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize,
mbi_thunk.Protect, &dwOldProtect));
SetLastError(ERROR_SUCCESS);
return TRUE;
}
}
// 訪問IMAGE_THUNK_DATA數組中的下一個元素
pOrigThunk++;
pRealThunk++;
}
return TRUE;
}
// GetNamedImportDescriptor函數的實現
PIMAGE_IMPORT_DESCRIPTOR GetNamedImportDescriptor(HMODULE hMole, LPCSTR szImportMole)
{
// 檢測參數
_ASSERT(szImportMole);
_ASSERT(hMole);
if ((szImportMole == NULL) || (hMole == NULL))
{
_ASSERT(FALSE);
SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);
return NULL;
}
// 得到Dos文件頭
PIMAGE_DOS_HEADER pDOSHeader = (PIMAGE_DOS_HEADER) hMole;
// 檢測是否MZ文件頭
if (IsBadReadPtr(pDOSHeader, sizeof(IMAGE_DOS_HEADER)) ||
(pDOSHeader->e_magic != IMAGE_DOS_SIGNATURE))
{
_ASSERT(FALSE);
SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);
return NULL;
}
// 取得PE文件頭
PIMAGE_NT_HEADERS pNTHeader = MakePtr(PIMAGE_NT_HEADERS, pDOSHeader, pDOSHeader->e_lfanew);
// 檢測是否PE映像文件
if (IsBadReadPtr(pNTHeader, sizeof(IMAGE_NT_HEADERS)) ||
(pNTHeader->Signature != IMAGE_NT_SIGNATURE))
{
_ASSERT(FALSE);
SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);
return NULL;
}
// 檢查PE文件的引入段(即 .idata section)
if (pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress == 0)
return NULL;
// 得到引入段(即 .idata section)的指針
PIMAGE_IMPORT_DESCRIPTOR pImportDesc = MakePtr(PIMAGE_IMPORT_DESCRIPTOR, pDOSHeader,
pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
// 窮舉PIMAGE_IMPORT_DESCRIPTOR數組尋找我們需要截獲的函數所在的模塊
while (pImportDesc->Name)
{
PSTR szCurrMod = MakePtr(PSTR, pDOSHeader, pImportDesc->Name);
if (stricmp(szCurrMod, szImportMole) == 0)
break; // 找到!中斷循環
// 下一個元素
pImportDesc++;
}
// 如果沒有找到,說明我們尋找的模塊沒有被當前的進程所引入!
if (pImportDesc->Name == NULL)
return NULL;
// 返回函數所找到的模塊描述符(import descriptor)
return pImportDesc;
}
// IsNT()函數的實現
BOOL IsNT()
{
OSVERSIONINFO stOSVI;
memset(&stOSVI, NULL, sizeof(OSVERSIONINFO));
stOSVI.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
BOOL bRet = GetVersionEx(&stOSVI);
_ASSERT(TRUE == bRet);
if (FALSE == bRet) return FALSE;
return (VER_PLATFORM_WIN32_NT == stOSVI.dwPlatformId);
}
/////////////////////////////////////////////// End //////////////////////////////////////////////////////////////////////
不知道在之前,有多少朋友嘗試過去實現「滑鼠屏幕取詞」這項充滿了挑戰的技術,也只有嘗試過的朋友才能體會到其間的不易,尤其在探索API函數的截獲時,手頭的幾篇資料沒有一篇是涉及到關鍵代碼的,重要的地方都是一筆代過,MSDN更是顯得蒼白而無力,也不知道除了IMAGE_IMPORT_DESCRIPTOR和IMAGE_THUNK_DATA,微軟還隱藏了多少秘密,好在硬著頭皮還是把它給攻克了,希望這篇文章對大家能有所幫助。
B. 我的電腦之前還可以屏幕取詞(有道),後來突然就無法取詞了,請問該怎麼辦
你去軟體那兒設置一下!!!
C. 電腦版有道詞典如何取詞有道詞典取詞常見問題分析
第一頁:電腦版有道詞典如何取詞?有道詞典取詞常見問題分析
第二頁:電腦版有道詞典如何取詞?有道詞典取詞常見問題分析2
第三頁:電腦版有道詞典如何取詞?有道詞典取詞常見問題分析3有道詞典是一款很小很強大的翻譯軟體,它除了具備中英、英中、英英翻譯功能外,創新的「網路釋義」功能將各類新興詞彙和英文縮寫收錄其中,並且擁有專業權威的大詞典。在生活中它是貼心實用的詞典,能強力智能取詞,幫助用戶進行翻譯。目前已經有超過8000萬用戶使用,所以小編就來與用戶們分享一下有道詞典怎麼屏幕取詞、有道詞典怎麼圖片取詞,還有一點可能用戶不太清楚,有道詞典也可以在谷歌瀏覽器(Chrome)中取詞,今天小編就一一的介紹一下,希望能幫助到大家。
有道詞典如何屏幕取詞?
1、打開「有道詞典」,如圖1所示:
(圖1)
2、點擊有道詞典面板的「左下角」,如圖2所示:
(圖2)
3、先點擊「設置」,接著點擊「軟體設置」按鈕,如圖3所示:
(圖3)
4、在「軟體設置」的對話框中,選擇「取詞劃詞」按鈕,如圖4所示:
(圖4)
5、勾選「啟用屏幕取詞」對話框,在下面選擇你要的取詞方式,一般選擇滑鼠取詞(也可以選擇其它取詞,但每個人的習慣不一樣,因人而異),如圖5所示:
(圖5)
6、最後保存設置,返回界面,用滑鼠選擇你要翻譯的文字,如圖6所示:(小編在這里以網路的新聞兩個字為例子)
(圖6)
7、選擇之後,滑鼠在選擇的內容上停留一下,就會彈出翻譯,如圖7所示:
(圖7)
更多有道詞典教程,盡在詞典軟體
http://www.gezila.com/special/cdcd
D. 有道詞典怎麼關閉屏幕取詞 屏幕取詞關閉方法
屏幕取詞是有道詞典桌面版的一大特色,但是有時候又不想進行屏幕取詞。那麼,有道詞典怎麼關閉屏幕取詞呢?下面,小編就為大家帶來屏幕取詞關閉方法,一起來了解一下吧!
點擊查看==>有道詞典常見問題匯總
方法一、
1、打開有道詞典桌面端,點擊左下角的有道圖標;
2、在彈出的功能菜單中選擇「設置」,然後點擊「軟體設置」;
3、在出現的「軟體設置」界面中,選擇「內容設置」;
4、在「內容設置」界面中,將「啟動屏幕取詞」全面的勾去掉結果即可。
方法二、
1、滑鼠右擊電腦右下角消息通知欄中的「有道詞典」;
2、在彈出的功能列表中,如果「屏幕取詞」全面的圖標是灰色狀態,說明屏幕取詞功能是關閉的。
E. 能屏幕取詞的詞典哪個最好
靈格斯軟體,集成多種軟體特點,速度快效率高
F. 有道詞典中的屏幕取詞與劃詞有什麼區別
有道詞典中的取詞和劃詞的區別在於取詞是自動翻譯,劃詞是手動選詞翻譯。
取詞的翻譯是滑鼠即指即譯,有道會自動設別單詞並翻譯;即滑鼠放在那裡,就會翻譯哪裡。
劃詞的翻譯是自己選擇要翻譯的單詞,有道詞典再翻譯。劃詞需要手動操作選擇需要翻譯的詞。有時候會遇到有道無法自動取詞,這是就可以選擇試試劃詞的方式,手動選取詞彙進行翻譯。
有道詞典的特色功能:
多國語言翻譯發音
有道詞典集成中、英、日、韓、法多語種專業詞典,切換語言環境,即可快速翻譯所需內容,網頁版有道翻譯還支持中、英、日、韓、法、西、俄七種語言的在線翻譯。
有道搜索引擎在抓取並獲得多達數十億的海量網頁數據後,利用有道獨創的「網頁萃取」技術挖掘並評價互為翻譯關系的中外文詞彙和句子,經過優化調整,得到最佳的翻譯結果。英日韓法語的單詞及例句都可點擊發音,清晰流暢的真人發音使得用戶可以輕松學習多國純正口語。
網頁全文翻譯
有道詞典全新增加網頁翻譯功能,用戶可直接在翻譯框內輸入網址,點擊翻譯即可得到翻譯後的該網址頁面,實現快速准確的中英日韓法五國語言全文翻譯,還可自動檢測語言環境,輕松翻譯長句及文章段落。
專業權威大詞典
有道詞典完整收錄《柯林斯英漢雙解大詞典》《21世紀大英漢詞典》《新漢英大辭典》《現代漢語大詞典》等多部專業權威詞典,詞庫大而全,查詞快又准,實現漢語成語、生僻字的直觀釋義,為用戶提供准確高效的翻譯寶典。
海量例句一鍵查詢
2300萬條例句一鍵查詢,還可根據單詞釋義選擇對應例句,幫用戶更加准確全面地理解單詞,在語境中活學活用。
專業詞彙學科標注
標注收納60萬專業詞彙,詞條涵蓋逾200個學科領域,180萬網路詞條內容豐富[5],提供一站式知識查詢服務。
G. 請問我在電腦上用的「有道詞典」在屏幕上取詞速度慢是怎麼回事
有道的屏幕取詞的反應速度太慢了,在同樣的網路環境下,使用同一台電腦和同樣的系統(譬如XP SP3),相比起金山來說,這個有道慢的讓人感到難受:在金山界面里,滑鼠一點,結果就出來了,而在有道里,滑鼠點了幾秒鍾,才出結果。卸載後重裝幾次無改善,甚至重裝系統後再安裝有道,也是一個德行;只好暫時用金山了_但是金山的翻譯似乎不如有道的更貼近一點。
H. 求一個能屏幕取詞的翻譯軟體。 首先不能是金山詞霸,這個在我辦公電腦上無法取詞
熱土迷你詞霸v1.0,
有道桌面詞典,
Babylon
I. 為什麼我的電腦無法對英文單詞屏幕取詞
如果是金山詞霸的話,屏幕取詞功能應該是被關閉了。到界面選擇屏幕取詞功能開就可以了,或者用鍵盤操作:ctrl+alt+F1就可以重新開啟此功能了。如果用的是詞霸豆豆,屏幕取詞須待滑鼠停在需要取意的詞上時按一下ctrl鍵。如果這些都不行的話,關閉再重新打開軟體。
J. 電腦上安裝了有道詞典總是自動取詞的解決方法
方法:
1、原因分析,為什麼回事這樣呢?
為什麼安裝了有道詞典之後,電腦上會自動取詞呢?後來小編分析,原因肯定是以為暗轉了有道詞典,有道詞典相關的取詞設置打開了!!只要關閉相關設置就好了!!!那應該怎麼辦呢?請看2
2、應該怎麼辦呢?
打開有道詞典,在電腦桌面有下角,找到有道詞典縮略圖,點擊滑鼠右鍵,找到「
軟體設置」,並打開「軟體設置」,如圖
3、在「軟體設置」裡面找到「取詞劃詞」選項卡,如圖
4、將「取詞劃詞」選項卡裡面的「啟用屏幕取詞」前面的對號去掉,如圖
5、設置完成之後,點擊「確定」按鈕,保存設置,親測實用!!希望對有需要的小夥伴有所幫助!!!
以上就是專題欄小編帶來的有道詞典教程,更多教程請看「http://www.zhuantilan.com/zt/youcidian/」