亚洲成精品动漫久久精久,九九在线精品视频播放,黄色成人免费观看,三级成人影院,久碰久,四虎成人欧美精品在永久在线

掃一掃
關(guān)注微信公眾號(hào)

詳細(xì)解析Windows按鍵突破專家的原理
2007-01-25   

相信在Window按鍵突破專家沒(méi)有出來(lái)的時(shí)候,很多人還不知道軟件還可以這樣編的吧,本人也是一樣,當(dāng)知道有Window按鍵突破專家這個(gè)軟件時(shí),仔細(xì)去想一下它的實(shí)現(xiàn)原理,才突然恍然大悟,原來(lái)原理居然是這么的簡(jiǎn)單,為什么以前我就沒(méi)有想到呢。

好了,不說(shuō)那么多廢話,直接進(jìn)入主題,我先是說(shuō)說(shuō)按鍵突破的原理。實(shí)現(xiàn)按鍵突破的其實(shí)就是EnableWindow這個(gè)函數(shù)。

BOOL EnableWindow(
HWND hWnd,
BOOL bEnable
);

hWnd 指定將要啟用或者禁用的窗口的句柄;

bEnable 若為TRUE則啟用窗口,為FALSE則禁用窗口。

只要把EnableWindow的第二個(gè)參數(shù)設(shè)置為TRUE,第一個(gè)參數(shù)填控件的句柄就將原來(lái)被禁止的控件重新變?yōu)榭捎谩?

現(xiàn)在的主要的問(wèn)題是怎么得到控件的句柄,用VC++的朋友,應(yīng)該都用過(guò)Spy++這個(gè)強(qiáng)大的工具吧,它可以得到任意控件的句柄,和窗口的類名,看完這篇文章后,讀者們也可以自己做一個(gè)屬于自己的Spy++啦。

先介紹一下RealChildWindowFromPoint這個(gè)函數(shù),該函數(shù)的功能是用來(lái)獲取在指定點(diǎn)上的子窗口的句柄。

HWND RealChildWindowFromPoint(
HWND hwndParent,       // 父窗口的句柄
POINT ptParentClientCoords // 以客戶坐標(biāo)指定的點(diǎn)
)

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

RealChildWindowFromPoint函數(shù)只能夠查找到由ptParentClientCoords 所得到的子窗口,但是無(wú)法得到最深層的窗口,也就是說(shuō)如果有兩個(gè)窗口重疊,就無(wú)法得到下面的窗口,這樣的情況是經(jīng)常出現(xiàn)的。

“第一個(gè)子窗口”的窗口和“最深層的窗口”的復(fù)選框窗口就重疊了,如果用 RealChildWindowFromPoint 就只能得到“第一個(gè)子窗口”的窗口,而無(wú)法的到“最深層的窗口”的復(fù)選框,所以只簡(jiǎn)單的調(diào)用這個(gè)函數(shù)是無(wú)法實(shí)現(xiàn)Spy++的功能的。

大家來(lái)看看這個(gè)函數(shù),這個(gè)函數(shù)會(huì)將鼠標(biāo)所在的位置的窗口句柄賦予*phWnd。讀者下次想得實(shí)現(xiàn)spy++的功能就調(diào)用這個(gè)函數(shù)就可以了。

解釋一下,用GetCursorPos得到的鼠標(biāo)位置,是屏幕的鼠標(biāo)位置,比如你的分辨率為1024*768,GetCursorPos這個(gè)函數(shù)得到的就是在1024*768這個(gè)屏幕范圍的鼠標(biāo)位置,而客戶區(qū)窗口坐標(biāo),指的是鼠標(biāo)在一個(gè)窗口上的坐標(biāo),不同于屏幕坐標(biāo)。

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

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

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

如果只是運(yùn)行一次這面的這些語(yǔ)句的話,還是不行的,必須在程序開(kāi)啟突破功能的時(shí)候一直運(yùn)行。所以,

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

但是,這樣的話,問(wèn)題又來(lái)了,就是讓程序休息100毫秒,這個(gè)程序還是會(huì)把所以的cpu都占用完的,總不能因?yàn)檫@一個(gè)程序,而把資源的耗盡了,這是誰(shuí)都不愿意看到的。這時(shí),就必須用到多線程了,對(duì)于多線程技術(shù),很多文章都有介紹了的,我就不多說(shuō)那么多了。

DWORD WINAPI run(LPVOID l)
{
while(k==1)
{
GetRealWindow(&s);
::EnableWindow(s,1);

Sleep(100);
}
ExitThread(dwThreadID);
return 1;
}

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

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

當(dāng)按了一下Button時(shí),就可以開(kāi)始實(shí)現(xiàn)按鍵突破的功能了。仔細(xì)看一下,會(huì)發(fā)現(xiàn)這個(gè)程序和Window按鍵突破專家有點(diǎn)不同,因?yàn)閃indow按鍵突破專家在鼠標(biāo)指向一個(gè)窗口時(shí),就會(huì)將那個(gè)窗口下所有被禁止的控件都變成可用,而本程序,是鼠標(biāo)指去哪個(gè)不可用的控件,那個(gè)控件就會(huì)編程可用,其他控件不受影響,如果想和Window按鍵突破專家一樣的功能,其實(shí)也很簡(jiǎn)單,只要改一下代碼就可以了,讀者們自己想想吧。

補(bǔ)充一點(diǎn):這個(gè)程序不能直接在VC++下運(yùn)行,因?yàn)樵创a將編譯不了,必須去微軟的老窩去下載最新的Windows Sdk,安裝以后,把所有的.h和.lib拷貝到VC++的相關(guān)目錄里。Windows sdk有許多有用的函數(shù),建議用VC++的朋友都應(yīng)該去下載。

熱詞搜索:

上一篇:黑客技巧之用UDP協(xié)議的木馬編寫方法
下一篇:教你如何注冊(cè)DLL或OCX文件

分享到: 收藏