GetWindowLong和SetWindowLong函数
我發(fā)現(xiàn)這兩個(gè)函數(shù)的功能真的不是一般的有意思,貼上這兩個(gè)函數(shù)函數(shù)原型:
LONG WINAPI SetWindowLong(_In_ HWND hWnd,_In_ int nIndex,_In_ LONG dwNewLong ); LONG WINAPI GetWindowLong(_In_ HWND hWnd,_In_ int nIndex );這兩個(gè)函數(shù)的資料在度娘上面也是不勝枚舉,同時(shí)本人在網(wǎng)絡(luò)上翻看了諸多大牛的文章,大家對(duì)這兩個(gè)函數(shù)的理解也都是入木三分。后來(lái)人便可綜合大家的總結(jié),更方便的理解這兩個(gè)函數(shù)。但一是本人水平實(shí)在有限,二是為了不再給網(wǎng)絡(luò)增加負(fù)擔(dān),所以本人決定理論的知識(shí)就不再贅述了,以免出現(xiàn)紕漏貽誤后來(lái)人。而是通過(guò)親身經(jīng)歷的兩個(gè)小例子來(lái)展示一下這兩個(gè)函數(shù)的強(qiáng)大之處。
1.設(shè)置窗口的透明屬性。
?這段代碼實(shí)現(xiàn)的功能就是讓我們電腦上的計(jì)算器再透明一點(diǎn),本來(lái)是這樣的,然后我們寫個(gè)程序使其變成這個(gè)鬼樣子。
??
以SDK為例,我們新建一個(gè)默認(rèn)工程,在默認(rèn)工程的回調(diào)函數(shù)里,添加一個(gè)右鍵處理消息,當(dāng)右鍵按下,獲取計(jì)算器的句柄,其中類名或者窗口名,可以通過(guò)VS自帶的SPY++獲得(32位和64位版本要對(duì)應(yīng)),然后通過(guò)這兩個(gè)函數(shù)獲取窗口屬性,用SetLayeredWindowAttributes函數(shù)設(shè)置透明色。(前提是要打開計(jì)算器,使能夠獲取句柄成功)。代碼如下:
1 case WM_RBUTTONDOWN: 2 { 3 //獲取計(jì)算器窗口句柄(這里也可以設(shè)置QQ了,英雄聯(lián)盟了,等一系列窗口) 4 HWND hCalc=FindWindow(_T("CalcFrame"), NULL);//這個(gè)函數(shù)也是非常非常有意思的。 5 if (hCalc!=NULL) 6 { 7 //通過(guò)GetWindowLong獲得窗口的屬性 8 int ExdStyle = (int)GetWindowLong(hCalc, GWL_EXSTYLE); 9 //通過(guò)SetWindowLong設(shè)置窗口的屬性,多增加了一個(gè)WS_EX_LAYERED支持透明 10 SetWindowLong(hCalc, GWL_EXSTYLE, ExdStyle | WS_EX_LAYERED); 11 //設(shè)置窗口的透明色 12 SetLayeredWindowAttributes( 13 hCalc, RGB(255, 255, 255), 14 100, LWA_ALPHA);//100代表透明度,0是全透明,255是不透明 15 } 16 17 } 18 break;2.改寫回調(diào)函數(shù)過(guò)濾消息。
比如改寫該進(jìn)程下的回調(diào)函數(shù),達(dá)到過(guò)濾右鍵按下的消息的目的
舊回調(diào)函數(shù): LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {switch (message){case WM_CREATE:{//OldProc返回值是SetWindowLong原來(lái)的回調(diào)函數(shù)的地址OldProc = (WNDPROC)SetWindowLong(hWnd, GWL_WNDPROC, (LONG)NewProc);//程序主窗口此時(shí)的回調(diào)函數(shù)是NewProc而不是WndProc; }break;case WM_RBUTTONDOWN:{MessageBox(hWnd, _T("舊的窗口回調(diào)函數(shù)里"), _T("提示"), NULL);}break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0; } 新回調(diào)函數(shù) LRESULT CALLBACK NewProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {switch (message){case WM_RBUTTONDOWN:{MessageBox(hWnd, _T("新的窗口回調(diào)函數(shù)里"), _T("提示"), NULL);}return 0;//達(dá)到過(guò)濾消息后,恢復(fù)原來(lái)的回調(diào)函數(shù),在OldProc中保存著default:return CallWindowProc(OldProc, hWnd, message, wParam, lParam);} }?
轉(zhuǎn)載于:https://www.cnblogs.com/wingss/p/5116602.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的GetWindowLong和SetWindowLong函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: FLASH CS6组件怎么制作视频播放器
- 下一篇: word的修订功能是什么?