• <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>

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            Windows按鍵突破專家的原理

            ?

            文章作者:Andyower
            信息來源:邪惡八進制信息安全團隊(
            www.eviloctal.com

            ? 相信在window按鍵突破專家沒有出來的時候,很多人還不知道軟件還可以這樣編的吧,本人也是一樣,當知道有window按鍵突破專家這個軟件時,仔細去想一下它的實現(xiàn)原理,才突然恍然大悟,原來原理居然是這么的簡單,為什么以前我就沒有想到呢。
            ? 好了,不說那么多廢話,直接進入主題,我先是說說按鍵突破的原理。實現(xiàn)按鍵突破的其實就是EnableWindow這個函數(shù)。

            ???????????????????????????????????

            代碼

            BOOL EnableWindow(
            HWND hWnd,
            BOOL bEnable
            );

            hWnd 指定將要啟用或者禁用的窗口的句柄
            bEnable 若為TRUE則啟用窗口,為FALSE則禁用窗口

            只要把EnableWindow的第二個參數(shù)設(shè)置為TRUE,第一個參數(shù)填控件的句柄就將原來被禁止的控件重新變?yōu)榭捎谩?br />現(xiàn)在的主要的問題是怎么得到控件的句柄,用vc++的朋友,應(yīng)該都用過spy++這個強大的工具吧,它可以得到任意控件的句柄,和窗口的類名,看完這篇文章后,讀者們也可以自己做一個屬于自己的spy++啦。
            先介紹一下RealChildWindowFromPoint這個函數(shù)
            該函數(shù)的功能是用來獲取在指定點上的子窗口的句柄

            代碼

            HWND RealChildWindowFromPoint(
            ? HWND hwndParent,??????????? // 父窗口的句柄
            ? POINT ptParentClientCoords? // 以客戶坐標指定的點
            )

            返回值:
            返回其子窗口句柄

            RealChildWindowFromPoint函數(shù)只能夠查找到由 ptParentClientCoords 所得到的子窗口,但是無法得到最深層的窗口,也就是說如果有兩個窗口重疊,就無法得到下面的窗口,這樣的情況是經(jīng)常出現(xiàn)的。
            ? 大家請開看圖一。
            “第一個子窗口”的窗口和“最深層的窗口”的復(fù)選框窗口就重疊了,如果用 RealChildWindowFromPoint 就只能得到“第一個子窗口”的窗口,而無法的到“最深層的窗口”的復(fù)選框,所以只簡單的調(diào)用這個函數(shù)是無法實現(xiàn)Spy++的功能的。
            大家來看看這個函數(shù),這個函數(shù)會將鼠標所在的位置的窗口句柄賦予*phWnd。讀者下次想得實現(xiàn)spy++的功能就調(diào)用這個函數(shù)就可以了。
            解釋一下,用GetCursorPos得到的鼠標位置,是屏幕的鼠標位置,比如你的分辨率為1024*768,GetCursorPos這個函數(shù)得到的就是在1024*768這個屏幕范圍的鼠標位置,而客戶區(qū)窗口坐標,指的是鼠標在一個窗口上的坐標,不同于屏幕坐標。

            代碼

            void GetRealWindow(HWND *phWnd)
            { ????????
            ??????? POINT ptPoint;
            ??????? HWND hWndTop = NULL;
            ??????? HWND hWndChild = NULL;
            ??????? POINT ptCooChild = { 0 };
            ??????
            ??????? //先得到ptPoint指向的(子)窗口,再通過子窗口得到父窗口的句柄
            ??????? GetCursorPos(&ptPoint);//得到鼠標的位置
            ??????? hWndTop = ::WindowFromPoint(ptPoint);//獲取鼠標包含指定點的窗口的句柄
            ??????? ptCooChild = ptPoint;
            ??????? *phWnd = GetParent(hWndTop);?????? //用來獲取最上層的父窗口的句柄
            ???????
            ??????? ::ScreenToClient(*phWnd, &ptCooChild);//該函數(shù)將屏幕的一個坐標轉(zhuǎn)換成客戶區(qū)(窗口)的坐標
            ??????
            ??????? //從最上層的窗口開始外下找,只直到找到最地層的窗口
            ??????? while (TRUE){
            ??????????? hWndChild = RealChildWindowFromPoint(*phWnd, ptCooChild);
            ??????? if (hWndChild && (hWndChild != *phWnd))
            ??????????????? *phWnd = hWndChild;
            ??????????? else
            ??????????????? break;
            ?????? }
            }

            呵呵,代碼不是很多,如果看不懂的話,不要緊,懂得調(diào)用這個函數(shù)就可以啦。
            現(xiàn)在要再調(diào)用EnableWindow就可以了。
            代碼

            HWND s;
            GetRealWindow(&s);
            ::EnableWindow(s,1);

            如果只是運行一次這面的這些語句的話,還是不行的,必須在程序開啟突破功能的時候一直運行。
            所以

            代碼

            while(1)
            ?? {
            ?? GetRealWindow(&s);
            ?? ::EnableWindow(s,1);
            ?? Sleep(100);
            ? }

            但是,這樣的話,問題又來了,就是讓程序休息100毫秒,這個程序還是會把所以的cpu都占用完的,總不能因為這一個程序,而把資源的耗盡了,這是誰都不愿意看到的,這時,就必須用到多線程了,對于多線程技術(shù),很多文章都有介紹了的.我就不多說那么多了。

            代碼

            DWORD WINAPI run(LPVOID l)
            {
            ? while(k==1)
            ?? {
            ?? GetRealWindow(&s);
            ?? ::EnableWindow(s,1);
            ??
            ?? Sleep(100);
            ?? }
            ? ExitThread(dwThreadID);
            ?? return 1;
            }

            先把實現(xiàn)按鍵突破的語句放在一個新的函數(shù)里。里面的這個k,是個全句變量,先在“資源”中添加一個Button按鍵(只是為了說明問題,所以程序做得很簡單)。

            代碼

            void CJiandanwindowDlg::OnButton1()
            {
            ?????? k=1;
            CreateThread(NULL,0,run,(LPVOID)i,0,&dwThreadID);
            }

            當按了一下Button時,就可以開始實現(xiàn)按鍵突破的功能了,仔細看一下,會發(fā)現(xiàn)這個程序和window按鍵突破專家有點不同,因為window按鍵突破專家在鼠標指向一個窗口時,就會將那個窗口下所有被禁止的控件都變成可用,而本程序,是鼠標指去哪個不可用的控件,那個控件就會編程可用,其他控件不受影響,如果想和window按鍵突破專家一樣的功能,其實也很簡單,只要改一下代碼就可以了,讀者們自己想想吧。
            補充一點:這個程序不能直接在vc++下運行,因為源代碼將編譯不了,必須去微軟的老窩去下載最新的windows sdk,安裝以后,把所有的.h和.lib拷貝到vc++的相關(guān)目錄里。windows sdk有許多有用的函數(shù),建議用vc++的朋友都應(yīng)該去下載。
            程序在winxp、vc++6.0下通過編譯

            ? ? 補:文章寫于windows按鍵突破專家剛剛出來的時候,當時已經(jīng)是幾年前了.一直沒有發(fā)表過,幾年前寫的東西難免有很多地方不足,但我也懶得改了,麻煩,如果需要原代碼,我也帖出來~

            posted on 2006-05-08 17:54 楊粼波 閱讀(290) 評論(0)  編輯 收藏 引用 所屬分類: 文章收藏

            久久婷婷色综合一区二区| 日韩欧美亚洲国产精品字幕久久久 | 久久久久久久久久免免费精品| 久久久无码精品亚洲日韩京东传媒 | 欧美伊香蕉久久综合类网站| 久久99久国产麻精品66| 久久青青草视频| 国产一区二区久久久| 亚洲国产精品成人久久蜜臀| 亚洲精品NV久久久久久久久久| 久久久噜噜噜久久中文字幕色伊伊| 久久国产精品-国产精品| 欧美一区二区精品久久| 国内精品久久久久久久涩爱| 久久996热精品xxxx| 国产精品免费久久久久电影网| 99久久精品免费看国产| 欧美精品一区二区久久| 一本久久a久久精品综合香蕉| 亚洲国产成人精品91久久久| 国产精品久久久久蜜芽| 久久久无码精品亚洲日韩按摩 | 久久国产成人精品麻豆| 99热成人精品免费久久| 香蕉99久久国产综合精品宅男自| 国产成人综合久久精品红| 日韩精品久久无码中文字幕| 四虎国产永久免费久久| 日韩十八禁一区二区久久| 伊人久久久AV老熟妇色| 久久国产精品-国产精品| 色综合久久久久综合99| 久久综合九色综合网站| 品成人欧美大片久久国产欧美...| 亚洲国产成人精品无码久久久久久综合| 中文字幕久久精品| 99精品国产在热久久| 久久男人中文字幕资源站| 久久久久亚洲AV无码永不| 亚洲国产高清精品线久久 | 亚洲va久久久久|