• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    屏幕抓字技術揭密

    發布: 2007-5-25 09:19 | 作者: hktl | 來源: 互聯網 | 查看: 47次 | 進入軟件測試論壇討論

    領測軟件測試網

    屏幕抓字技術揭密
    ----------深入WINDOWS內部探險手記

    鄭州 馬飛濤

    一 公開它!
    四通利方和金山詞霸的用戶都曾見識過屏幕抓字技術,鼠標指哪就翻譯哪個單
    詞,這個技術看似簡單,其實在WINDOWS系統中實現卻是非常復雜和有趣的。 經
    過半年多的艱辛探索,筆者終于破解了其中的秘密,并在今天決定公開它,這個
    人人 都曾見過但是卻鮮有人知的秘密,這個只被幾家軟件公司壟斷從未在公開的報刊 資 料披露過只言片語的秘密!
    回想這半年多的探索,其中浸潤了多少筆者的苦悶與歡樂,絕望與興奮,挫 折
    與收獲,現在都終于有了結果:將屏幕抓字技術的秘密公開,獻給孜孜不倦辛勤
    工 作的程序員們。如果這樣做能為國產軟件事業的發展效微薄之力,對筆者來說,也 是一樁快事!

    二 初識屏幕抓字

    最初知道屏幕抓字, 是在購買了〖英漢通〗軟件之后。 當時筆者還只是一 個
    VISUAL BASIC 的初學者, 對 WINDOWS 系統內部的知識了解并不多, 認為 在
    WINDOWS系統中屏幕抓字的實現應該和DOS系統中的一樣,調用一個DOS 中斷取屏
    幕 上的字符或直接讀顯示內存的內容就可以了。

    三 看似很簡單,其實不然

    隨著對WINDOWS系統的認識不斷深入,才發現問題并不象想得那么簡單。首先,
    翻閱了WINODWS應用程序接口(API)中的上千個函數,并沒有發現有一個現成的
    類 似于getWordFromPoint()的函數;根據使用經驗,經過判斷發現屏幕抓字采用的 也 不是圖像識別技術;翻閱了SDK的聯機文檔中沒有,DDK的聯機文檔中也沒有;顯示 卡編程接口的資料則很難獲得,有的也只是CGA到VGA顯存的基本知識;叵氘敃r 坐 在機子前,面對一屏屏的聯機資料(如果是紙,將堆積如山),感覺就是在黑暗 中 的大海里航行,沒有方向,沒有燈光,但強烈的興趣緊抓著我,一定要把這個謎 解 開。

    四 選擇合適的編程工具

    突然又有了一些新的想法:
    可否試著截獲WINDOWS中關于字符的消息呢?
    DC(設備描述表)到底是什么?
    WINDOWS的TextOut函數是否將TEXT放在DC的某個單元中?
    顯然,用VISUAL BASIC就力不從心了。在DOS中用TURBO C編程筆者還算熟練
    ,

    因此先嘗試用VISUAL C++,但是奇慢的編譯速度使人難以忍受, 高度抽象的類
    讓 人一頭霧水,開發商務軟件可能還行,但開發這樣一個深入WINDOWS 內部的系統  件,望著一堆纏繞不清的類和消息,真有點牛刀宰雞、刺刀耕田的感覺。
    最后選擇了DELPHI,第一印象是編譯速度真快,在我的祖父型386 機子上 編
    譯一個WINDOWS程序,速度和用TURBO C的速度感覺差不多,真讓人興奮得愛不釋手。 隨著不斷使用,發覺DELPHI真是一個好的快速開發工具,(快速并不意味著簡單 粗 糙,而是和WINDOWS系統有混然一體良好接口的表現)讓初學者也很容易上手。 調 用各種WINDOWS 函數(包括很多未公開的函數)都非常直接迅速,用它來作開發 工 具,大有刺刀見紅、一劍封喉的痛快感覺。

    五 山窮水盡疑無路

    隨著對WINDOWS系統了解的深入,我逐漸明白了在向屏幕輸出文字時,WINDO
    WS 系統僅僅只是對某個應用程序發送WM_PAINT消息,告訴該應用程序窗口用戶區已 經
    “無效”而需要重畫。具體的“繪制”工作(選擇字體,顏色,文字)由應用程
    序 完成。 應用程序在處理WM_PAINT消息時,調用BeginPaint和EndPaint來獲得和釋放 設 備描述表,調用DrawText、ExtTextOut、 TextOut等函數在設備描述表中“繪制 ” 文字。 應用程序“繪制”文字, 就象學生(應用程序)奉命(獲得 WM_PAINT消息 ) 用老師(WINDOWS)提供的畫筆(DrawText ExtTextOut TextOut等) 在黑板上畫 畫 一樣,雖然大家能看到畫的是什么字,但是畫筆作為繪圖工具并不知道畫的是什 么。

    老師(WINDOWS)不知道學生(應用程序)到底用什么字體,顏色,畫哪些文字。

       總之 ,WINDOWS并不知道應用程序“繪制”的是什么!拔淖帧睂 WINDO
    WS

    來說只是畫筆留在黑板(屏幕)上的粉筆印,只是繪畫的痕跡!拔淖帧敝淮嬖


    應用程序的模塊中,對WINDOWS系統是“不可見”的。
    到處走投無路,真想掂5000塊錢,跑到“英漢通”公司買回這個秘密。仔細


    想,錢太少,就是多掂10倍,人家也不一定說。

    六 柳暗花明又一村

    經過再三考慮,我聯想到在DOS系統中編程,會采取改變中斷向量地址, 設


    新的中斷向量的技術:如果系統調用這個中斷,就會先進入新的中斷服務程序,


    后再調用原來的中斷服務程序。
    那末,在WINDOWS系統中也采取這種技術,使系統如果調用某個函數, 先進


    一個跟蹤函數,取得原函數的參數,再調用原來的函數。聽起來是否象病毒傳染


    發作?其實很多程序都采用過類似技術。大學畢業設計聲卡時我就用過。
    至此, 我認識到應該放棄常規的思路, 采取一些技巧, 截獲 TextOut
    、

    ExtTextOut等函數,使之轉向我的跟蹤函數,在此查看應用程序(學生)的堆棧


    傳遞給畫筆(TextOut、ExtTextOut等函數)的參數, 從而獲得應用程序要在屏


    上寫的“文字”。

    七 “ 屏幕抓字”的實現

    1 用SetWindowsHookEx()安裝鼠標鉤子MouseProc;
    2 在屏幕上移動鼠標時,系統就會調用鼠標鉤子MouseProc;
    3 進入MouseProc,獲得鼠標的坐標(x,y),
    設置對TextOut()、ExtTextOut()等的跟蹤程序,
    用invalidateRect()告訴系統該點(x,y)“失效”;

    系統發出WM_PAINT消息,指示該點(x,y)處的應用程序重繪“失效”的區域。
    5 負責繪制該點()的應用程序在受到 WM_PAINT 消息后, 就有機會調用

    TextOut()、 ExtTextOut()等函數。
    6 調用的函數被攔截進入跟蹤程序:設置好了的跟蹤程序截獲了該次調用,


    應用程序的堆棧中取出 該點(x,y)“文字”的指針;
    7 從應用程序的數據段中將“文字”指針的內容取出,即完成了一次“屏幕


    字”;
    8 退出跟蹤程序,返回到鼠標鉤子MouseProc;
    9 在MouseProc中解除對TextOut() ExtTextOut()的跟蹤;
    10 退出MouseProc鼠標鉤子程序,控制權交給系統。
    11 在屏幕上移動鼠標,開始下一次“屏幕抓字”,返回步驟2。

    八 前景展望
    掌握了“屏幕抓字”的技術秘密,稍加改變,我們就可對WINDOWS 系統中


    任意一個函數調用進行動態地攔截、跟蹤、修改和恢復,就可讓WINDOWS 系統中


    任意一個函數按我們的設想工作,就可構造自己的外掛漢字平臺,設計改變字體


    放大鏡、改變顏色的變色鏡,保護視力的軟件視保屏等等。

    九 后記

    希望此文能拋磚引玉,為大家編程時能找到捷徑,開拓出新的思路;
    對攔截、跟蹤感興趣的朋友也請來信交流切磋,如需DLL 或“抓字”的源
    代 碼,敬請
    mafeitao@371.net 聯系;

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>