• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Codejie's C++ Space

            Using C++

            LingosHook: Lingoes生詞本第一步


            ??? 一直在用Lingoes作為翻譯工具,占用空間小,運(yùn)行比較穩(wěn)定,詞典可以任意切換,使用起來(lái)要比Kingsoft的詞霸感覺(jué)--“輕松”~
            ??? Lingoes有個(gè)沒(méi)法和詞霸相比的功能--生詞本。對(duì)于我這樣記性不好的人來(lái)說(shuō),如果能夠記錄自己曾經(jīng)“認(rèn)真”背誦過(guò)的單詞,然后再“強(qiáng)化”一下,應(yīng)該會(huì)有好的效果(實(shí)際差不多,一樣過(guò)三天就記不住了),因此這個(gè)功能對(duì)我來(lái)說(shuō)比較--實(shí)用。但,Lingoes無(wú)此功能~
            ??? 在網(wǎng)上查找,發(fā)現(xiàn)很有些人跟我有同感,并也有人士完成了此功能,大喜,下載使用,嗯,功能都有,只是我用起來(lái)不太順手。于是,發(fā)揚(yáng)“輪子精神”,然后便有了這個(gè)--LingosHook~

            ??? 如其名字,由于無(wú)法知道Lngoes內(nèi)部實(shí)現(xiàn),只能走旁門(mén)--HOOK了。而如我們所知,要想用Hook,DLL是少不了的,前期關(guān)于DLL的練習(xí)也做了很久了,但上周才把可用的DLL剛剛調(diào)試完成,然后加上一個(gè)測(cè)試的App,就有了下面的截圖。


            ??? 上圖中,顯式了由Lingoes結(jié)果窗口(未截圖)中Hook到的HTML和TEXT內(nèi)容,這樣在加上SQLite和一些管理策略代碼,一個(gè)生詞本應(yīng)該就可以完成了.

            ??? 實(shí)現(xiàn)的關(guān)鍵還是Hook的DLL,有興趣,請(qǐng)點(diǎn)擊這里下載。其中包括了測(cè)試用的App。DLL的exports如下:


            ??? CreateHookThread用于“注冊(cè)”,RemoveHookThread用于“卸載”。下面是調(diào)用的主要代碼,我使用的開(kāi)發(fā)測(cè)試環(huán)境是XP SP3+VCExpress 9.0+wxWidgets 2.8.10,還有l(wèi)ingoes 2.63。如果測(cè)試的app不能運(yùn)行,請(qǐng)先到MS下載相應(yīng)的VC發(fā)布包試試。
            ??
            ? ? 實(shí)現(xiàn)步驟如下:
            ??? 1.向Lingoes注冊(cè)截取消息的Hook DLL;
            ??? 2.創(chuàng)建線程,用于等待Hook發(fā)現(xiàn)Lingoes“截取到文本”觸發(fā)的WM_COPYDATA消息后的事件;
            ??? 3.線程收到事件后,向注冊(cè)進(jìn)程發(fā)送內(nèi)部消息,轉(zhuǎn)發(fā)Lingoes的翻譯結(jié)果,其中結(jié)果分為HTML和TEXT兩種結(jié)果;
            ??? 4.注冊(cè)線程收到消息后,顯式結(jié)果。

            ??? 注冊(cè)代碼:

            void ?MyFrame::OnBtnHook(wxCommandEvent? & event )
            {
            ????_hDll?
            = ?::LoadLibrary(_T( " ../Debug/LingosHook.dll " ));
            ????
            if (_hDll? != ?NULL)
            ????
            {
            ????????CreateHookThreadPtr?pch?
            = ?(CreateHookThreadPtr)GetProcAddress(_hDll,? " CreateHookThread " );
            ????????
            if (pch? != ?NULL)
            ????????
            {
            ????????????
            if (pch((HWND) this -> GetHandle(),?NULL,?NULL,? & _nMsgID)? != ?TRUE)
            ????????????
            {
            ????????????????wxMessageBox(_(
            " call?CreateHookThread()?failed. " ));
            ????????????????::FreeLibrary(_hDll);
            ????????????}

            ????????}

            ????????
            else
            ????????
            {
            ????????????wxMessageBox(_(
            " Get?CreateHookThread?address?failed. " ));
            ????????}

            ????}

            ????
            else
            ????
            {
            ????????wxMessageBox(_(
            " Load?LingosHook?dll?failed. " ));
            ????}



            // ????event.Skip();
            // ????wxLogDebug(wxT("Event?handler?(MyFrame::OnBtnHook)?not?implemented?yet"));? // notify?the?user?that?he?hasn't?implemented?the?event?handler?yet
            }


            ??? 卸載代碼:

            void ?MyFrame::OnBtnUnhook(wxCommandEvent? & event )
            {
            ????
            if (_hDll? != ?NULL)
            ????
            {
            ????????RemoveHookThreadPtr?prh?
            = ?(RemoveHookThreadPtr)GetProcAddress(_hDll,? " RemoveHookThread " );
            ????????
            if (prh? != ?NULL)
            ????????
            {
            ????????????
            if (prh()? != ?TRUE)
            ????????????
            {
            ????????????????wxMessageBox(_(
            " call?RemoveHookThread()?failed. " ));
            ????????????}

            ????????}

            ????????
            else
            ????????
            {
            ????????????wxMessageBox(_(
            " Get?RemoveHookThread?address?failed. " ));
            ????????}

            ????????::FreeLibrary(_hDll);
            ????????_hDll?
            = ?NULL;
            ????}


            // ????event.Skip();
            // ????wxLogDebug(wxT("Event?handler?(MyFrame::OnBtnUnhook)?not?implemented?yet"));? // notify?the?user?that?he?hasn't?implemented?the?event?handler?yet
            }


            ??? 消息處理代碼:

            WXLRESULT?MyFrame::MSWWindowProc(WXUINT?message,?WXWPARAM?wParam,?WXLPARAM?lParam)
            {
            ????
            if (message? == ?_nMsgID)
            ????
            {
            ????????wxLogDebug(_(
            " msg:%d,?wparam:%d,?lparam:%d " ),?message,?wParam,?lParam);

            ????????
            struct ?_HookData_t * ?hd? = ?(reinterpret_cast < struct ?_HookData_t *> (lParam));
            ????????wxString?str;
            ????????
            if (hd? != ?NULL? && ?hd -> data? != ?NULL)
            ????????
            {
            ????????????str.append(hd
            -> data,?hd -> size); // ,?wxMBConvUTF16,?hd->size);
            ????????????
            // delete?[]?hd->data;
            ????????}
            ????????

            ????????
            // if(wParam?==?HKT_CATCH)
            ????????
            // {
            ????????
            // ????wxLogDebug(_T("get?CATCH?message."));
            ????????
            // ????_textEdit->AppendText(_("CATCH:")?+?str?+?_("\n"));
            ????????
            // }
            ????????
            // else
            ???????? if (wParam? == ?HKT_RESULT_TEXT)
            ????????
            {
            ????????????wxLogDebug(_T(
            " get?RESULT_TEXT?message. " ));
            ????????????_textEdit
            -> AppendText(_( " \n---------------TEXT---------------\n " )? + ?str);
            ????????}

            ????????
            else ? if (wParam? == ?HKT_RESULT_HTML)
            ????????
            {
            ????????????wxLogDebug(_T(
            " get?RESULT_HTLM?message. " ));
            ????????????_textEdit
            -> AppendText(_( " \n---------------HTML---------------\n " )? + ?str);
            ????????}

            ????????
            else
            ????????
            {
            ????????????wxLogDebug(_T(
            " get?UNKNOWN?message. " ));
            ????????}

            ????}

            ????
            return ?wxFrame::MSWWindowProc(message,?wParam,?lParam);
            }

            posted on 2009-11-16 12:53 codejie 閱讀(787) 評(píng)論(2)  編輯 收藏 引用 所屬分類(lèi): C++

            評(píng)論

            # re: LingosHook: Lingoes生詞本第一步[未登錄](méi) 2009-11-17 10:07 Liu

            看完以后的感覺(jué),moto給你的活太少了,你在家里也不用干家務(wù)看孩子……  回復(fù)  更多評(píng)論   

            # re: LingosHook: Lingoes生詞本第一步 2009-11-17 10:20 codejie

            @Liu
            嘿嘿。。。不能這么說(shuō)啊,你應(yīng)該知道我敲字比較快了,多出的時(shí)間就換換做做了~關(guān)于看孩子的事情,咱們應(yīng)該都一樣了,只有寶寶睡著了,咱們才能自由活動(dòng)啊~  回復(fù)  更多評(píng)論   

            公告

            Using C++

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(73)

            隨筆分類(lèi)(513)

            積分與排名

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久精品18| 精品久久人人爽天天玩人人妻| 91麻豆国产精品91久久久| 久久久久久精品免费免费自慰| 伊人久久大香线蕉av不卡 | 嫩草影院久久国产精品| 亚洲国产成人久久精品动漫| 香蕉久久影院| 国产精品美女久久久久网| 久久久久亚洲av成人无码电影 | 亚洲&#228;v永久无码精品天堂久久 | 丁香狠狠色婷婷久久综合| 青青草国产97免久久费观看| 久久一日本道色综合久久| 亚洲第一永久AV网站久久精品男人的天堂AV | 国产精品久久久久影院嫩草| 欧美久久一级内射wwwwww.| 亚洲а∨天堂久久精品9966| 久久精品九九亚洲精品| 亚洲一区精品伊人久久伊人| 久久久久中文字幕| 亚洲精品无码久久久久| 思思久久99热免费精品6| 青青草国产成人久久91网| 久久WWW免费人成一看片| 亚洲国产小视频精品久久久三级| 亚洲va中文字幕无码久久| 久久免费视频1| 香蕉99久久国产综合精品宅男自| 国产精品一区二区久久精品无码| av午夜福利一片免费看久久| 久久婷婷五月综合色奶水99啪| 亚洲国产精品狼友中文久久久| 精品免费久久久久国产一区| 久久无码av三级| 777久久精品一区二区三区无码| 久久99精品久久久久婷婷| 久久国产精品成人影院| 国产婷婷成人久久Av免费高清| 东京热TOKYO综合久久精品| 久久精品夜夜夜夜夜久久|