免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
GetWindowLong說(shuō)明及應(yīng)用

“窗口類(lèi)的封裝,從全局窗口消息處理到窗口對(duì)象消息處理的映射方法:
 
  對(duì)界面進(jìn)行封裝,一般都是一個(gè)窗口一個(gè)類(lèi),比如實(shí)現(xiàn)一個(gè)最基本的窗口類(lèi)CMyWnd,你一定會(huì)把窗口過(guò)程作為這個(gè)類(lèi)的成員函數(shù),但是使用WINAPI創(chuàng)建窗口時(shí)必須注冊(cè)類(lèi)WNDCLASS,里面有個(gè)成員數(shù)據(jù)lpfnWndProc需要WNDPROC的函數(shù)指針,一般想法就是把窗口類(lèi)的消息處理函數(shù)指針傳過(guò)去,但是類(lèi)成員函數(shù)除非是靜態(tài)的,否則無(wú)法轉(zhuǎn)換到WNDPROC,而全局的消息處理函數(shù)又無(wú)法得到窗口類(lèi)對(duì)象的指針。這里有幾種解決辦法:
 
  一種解決方法是用窗口列表,開(kāi)一個(gè)結(jié)構(gòu)數(shù)組,窗口類(lèi)對(duì)象創(chuàng)建窗口的時(shí)候把窗口HWND和this指針?lè)湃霐?shù)組,全局消息處理函數(shù)遍歷數(shù)組,利用HWND找出this指針,然后定位到對(duì)象內(nèi)部的消息處理函數(shù)。這種方法查找對(duì)象的時(shí)間會(huì)隨著窗口個(gè)數(shù)的增多而增長(zhǎng)。
 
  另一種方法比較聰明一點(diǎn),WNDCLASS里面有個(gè)成員數(shù)據(jù)cbWndExtra一般是不用的,利用這點(diǎn),注冊(cè)類(lèi)時(shí)給該成員數(shù)據(jù)賦值,這樣窗口創(chuàng)建時(shí)系統(tǒng)會(huì)根據(jù)該值開(kāi)辟一塊內(nèi)存與窗口綁定,這時(shí)把創(chuàng)建的窗口類(lèi)的指針?lè)诺皆搲K內(nèi)存,那么在靜態(tài)的窗口消息循環(huán)函數(shù)就能利用GetWindowLong(hWnd,GWL_USERDATA)取出該指針,return (CMyWnd*)->WindowProc(...),這樣就不用遍歷窗口了。但是這樣一來(lái)就有個(gè)致命弱點(diǎn),對(duì)窗口不能調(diào)用SetWindowLong(hWnd,GWL_USERDATA,數(shù)據(jù)),否則就會(huì)導(dǎo)致程序崩潰。幸好這個(gè)函數(shù)(特定這幾個(gè)參數(shù))是調(diào)用幾率極低的,對(duì)于窗口,由于創(chuàng)建窗口都是調(diào)用窗口類(lèi)的Create函數(shù),不用手工注冊(cè)WNDCLASS類(lèi),也就不會(huì)調(diào)用SetWindowLong函數(shù)。但是畢竟缺乏安全性,而且當(dāng)一秒鐘內(nèi)處理的窗口消息很多時(shí),這種查找速度也可能不夠快。
 

 
創(chuàng)建窗口時(shí): SetWindowLong( m_hWnd, GWL_USERDATA, (LONG) this );

函數(shù)功能描述:用這個(gè)函數(shù)能夠獲得指定窗口的信息
 
函數(shù)原型:
LONG GetWindowLong( HWND hWnd,int nIndex )
 
參數(shù):
hWnd:指定窗口的句柄
nIndex:需要獲得的信息的類(lèi)型
     值            功能
 
nIndex取值如下:
GWL_EXSTYLE    得到擴(kuò)展的窗口風(fēng)格
GWL_STYLE      得到窗口風(fēng)格
GWL_WNDPROC    得到窗口回調(diào)函數(shù)的地址,或者句柄。得到后必須使用CallWindowProc函數(shù)來(lái)調(diào)用
GWL_HINSTANCE  得到應(yīng)用程序運(yùn)行實(shí)例的句柄
GWL_HWNDPARENT 得到父窗口的句柄
GWL_ID         得到窗口的標(biāo)識(shí)符
GWL_USERDATA   得到和窗口相關(guān)聯(lián)的32位的值(每一個(gè)窗口都有一個(gè)有意留給創(chuàng)建窗口的應(yīng)用程序是用的32位
               的值)
 
當(dāng)hWnd標(biāo)識(shí)一個(gè)對(duì)話(huà)框時(shí)可以使用下面的值
Value Action
DWL_DLGPROC   得到對(duì)話(huà)框回調(diào)函數(shù)的地址,或者句柄。得到后必須使用CallWindowProc函數(shù)來(lái)調(diào)用
DWL_MSGRESULT 得到對(duì)話(huà)框回調(diào)函數(shù)中消息處理過(guò)程的返回值
DWL_USER      得到額外的應(yīng)用程序私有信息,如一些句柄和指針等
 
返回值:
成功時(shí),返回一個(gè)請(qǐng)求的32位的值
失敗時(shí),返回0,可以使用GetLastError來(lái)取得錯(cuò)誤信息
 
示例:
long nStyle = ::GetWindowLong(hWnd, GWL_STYLE);   // hWnd是一個(gè)編輯框的句柄
if(nStyle & ES_PASSWORD)
{
    AfxMessageBox("這是一個(gè)密碼域");
}


下面是一個(gè)具體的應(yīng)用:
 
星號(hào)密碼查看工具大家都用過(guò)吧?現(xiàn)在我們自己來(lái)寫(xiě)一個(gè)超級(jí)簡(jiǎn)單的。密碼框其實(shí)就是Windows的一個(gè)子窗口,顯示星號(hào)是因?yàn)槊艽a框設(shè)置了EM_SETPASSWORDCHAR屬性,只要我們把密碼框的EM_SETPASSWORDCHAR屬性去掉,那么密碼就會(huì)以明文顯示了。我們可以給程序發(fā)送消息去掉EM_SETPASSWORDCHAR屬性,通過(guò)安裝鼠標(biāo)鉤子監(jiān)視鼠標(biāo)動(dòng)作,如果用戶(hù)單擊的是密碼框,那么就發(fā)送一個(gè)去除密碼屬性的消息。
本文使用的編程工具為VC6.0,具體實(shí)現(xiàn)步驟和代碼如下。
1)生成一個(gè)基于對(duì)話(huà)框的程序pass。打開(kāi)passDlg.cpp,加入下面的全局變量和鼠標(biāo)鉤子函數(shù)。

HHOOK g_hHook = NULL;//全局鉤子函數(shù)句柄
//鼠標(biāo)鉤子函數(shù)
LRESULT CALLBACK HookProc( int code, WPARAM wParam,LPARAM lParam )
{
HWND hwnd;
POINT point;
GetCursorPos(&point);
//得到鼠標(biāo)位置
hwnd=::WindowFromPoint(point);
//得到包含鼠標(biāo)的窗口句柄
long nStyle=::GetWindowLong(hwnd,GWL_STYLE);
//得到窗口風(fēng)格

EVENTMSG *event=(EVENTMSG *)lParam;
if(event->message==WM_LBUTTONDOWN)
//是否為鼠標(biāo)左鍵
{
if(nStyle & ES_PASSWORD)
//是否為密碼框
{
::PostMessage(hwnd, EM_SETPASSWORDCHAR,0,0);
//去掉密碼屬性
}
}
return CallNextHookEx(g_hHook,code,wParam,lParam);
}

這里需要注意的是,程序中的::PostMessage(hwnd, EM_SETPASSWORDCHAR,0,0);只能是PostMessage,而不能用SendMessage代替。
2)添加“開(kāi)始探測(cè)”按鈕及響應(yīng)函數(shù)OnOK(),并在函數(shù)中安裝鉤子。

void CPassDlg::OnOK()
{
g_hHook=SetWindowsHookEx(WH_JOURNALRECORD,HookProc,GetModuleHandle(NULL),0);
//安裝鉤子
}

鉤子的第三部分使用GetModuleHandle(NULL)函數(shù),意為把自己作為保存鉤子的DLL。
  3)添加“取消退出”按鈕及響應(yīng)函數(shù)OnExit(),并在函數(shù)中卸載鉤子。
  
void CPassDlg::OnExit()
{

if(g_hHook)
UnhookWindowsHookEx(g_hHook);
//卸載鉤子
exit(0);
}

至此,整個(gè)程序就編寫(xiě)完成了。打開(kāi)我們的程序,按下“開(kāi)始探測(cè)”按鈕,再打開(kāi)需要輸入密碼的程序試試,是不是以明文顯示了?用這個(gè)小程序可以搞定系統(tǒng)的密碼設(shè)置、Outlook或防范不嚴(yán)的程序密碼,但對(duì)有專(zhuān)門(mén)防范的程序就不行了,比如新版QQ。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
ID--HANDLE--HWND三者之間的互相轉(zhuǎn)換(轉(zhuǎn)) - 龍成 - 博客園
GetWindowLong函數(shù)(最好的解釋資料,絕對(duì)值得一看,此函數(shù)在子類(lèi)化技巧時(shí)候經(jīng)常用...
VC 窗口處理函數(shù)
自定義VB系統(tǒng)控件
VB入門(mén)技巧N例(1)
VC 單文檔程序全屏顯示及恢復(fù)--孤身我路!(My Blog)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服