




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
VB模擬掃雷游戲的嘗試編程目的那天老師展示了一個(gè)不完全的掃雷,激發(fā)了編程欲望,于是寫了掃雷來(lái)練練手。編程思路新建command_up和label_down,本來(lái)要用text_down,但是后來(lái)在左右鍵同時(shí)按下的時(shí)候與TextBox的enable沖突,于是改成label。用load加載控件根據(jù)雷區(qū)的X、Y、以及難度進(jìn)行隨機(jī)布雷。統(tǒng)計(jì)每一個(gè)label周圍雷的數(shù)量并作為label的caption。在單擊command的時(shí)候顯示label在右擊command的時(shí)候進(jìn)行標(biāo)記在label上左右鍵同時(shí)按下的時(shí)候檢查已標(biāo)記雷的數(shù)量與label顯示的數(shù)量是否一致。界面設(shè)計(jì)代碼設(shè)計(jì)DimStart_Time,End_TimeDimArea_X%,Area_Y%,Area%,Area_List()DimCurrent_Mine%DimDifficulty#DimContinue_Flag%,Success_Flag%,LeftAndRight_Flag%DimNear_ListDimMine_CountPrivateSubCommand_End_Click()EndEndSubPrivateSubDelete_Item(List(),IndexAsInteger)Dimi%Fori=LBound(List)+Index-1ToUBound(List)-1List(i)=List(i+1)Nexti'防止100%的困難度IfUBound(List)>LBound(List)ThenReDimPreserveList(LBound(List)ToUBound(List)-1)EndSubPrivateSubCommand_retry_Click()'卸載Fori=1ToAreaUnloadLabel_Down(i)UnloadCommand_Up(i)NextiCommand_Start.Caption="開(kāi)始游戲"CallCommand_Start_ClickEndSubPrivateSubCommand_Up_Click(IndexAsInteger)Success_Flag=1IfContinue_Flag=1ThenIfTimer1.Enabled=FalseThenCallCommand_Start_ClickIfLabel_Down(Index).Caption="X"ThenSuccess_Flag=0Continue_Flag=0Fori=1ToAreaIfCommand_Up(i).Visible=TrueAndCommand_Up(i).Caption="X"AndLabel_Down(i).BackColor=vbRedThen'標(biāo)記雷正確Command_Up(i).Picture=LoadPicture(App.Path+"\pictures\mine_correct.gif",,,Command_Up(i).Width,Command_Up(i).Height)Command_Up(i).Visible=TrueLabel_Down(i).Visible=TrueElseIfCommand_Up(i).Visible=TrueAndCommand_Up(i).Caption="X"AndLabel_Down(i).BackColor=vbGreenThen'標(biāo)記雷錯(cuò)誤Command_Up(i).Picture=LoadPicture(App.Path+"\pictures\mine_wrong.gif",,,Command_Up(i).Width,Command_Up(i).Height)Command_Up(i).Visible=TrueLabel_Down(i).Visible=TrueElseCommand_Up(i).Visible=FalseLabel_Down(i).Visible=TrueEndIfNextiTimer1.Enabled=Falsetemp=MsgBox("GameOver!",vbOKOnly,"游戲結(jié)束")ElseIfVal(Label_Down(Index).Caption)>0ThenCommand_Up(Index).Visible=FalseLabel_Down(Index).Visible=TrueElse'如果等于0的話應(yīng)該將周邊的清零Command_Up(Index).Visible=FalseLabel_Down(Index).Visible=Truej=IndexFori=1To8'判斷控件是否存在Ifj+Near_List(i)>0Andj+Near_List(i)<=AreaThen'判斷是否相鄰IfAbs(Label_Down(j+Near_List(i)).Left-Label_Down(j).Left)<=Label_Down(j).WidthAndAbs(Label_Down(j+Near_List(i)).Top-Label_Down(j).Top)<=Label_Down(j).HeightThen'判斷是否有雷IfLabel_Down(j+Near_List(i)).BackColor=vbGreenAndCommand_Up(j+Near_List(i)).Visible=TrueThenCallCommand_Up_Click(j+Near_List(i))'注意此處循環(huán)調(diào)用的時(shí)候一定要避免陷入死循環(huán)EndIfEndIfEndIfNextiEndIf'檢查是否游戲成功Fori=1ToAreaIfCommand_Up(i).Visible=TrueAndLabel_Down(i).Caption<>"X"ThenSuccess_Flag=0ExitForEndIfNextiIfSuccess_Flag=1ThenIfContinue_Flag=1ThenTimer1.Enabled=FalseFori=1ToAreaIfCommand_Up(i).Visible=TrueAndCommand_Up(i).Caption="X"AndLabel_Down(i).BackColor=vbRedThen'標(biāo)記雷正確Command_Up(i).Picture=LoadPicture(App.Path+"\pictures\mine_correct.gif",,,Command_Up(i).Width,Command_Up(i).Height)Command_Up(i).Visible=TrueLabel_Down(i).Visible=TrueElseIfCommand_Up(i).Visible=TrueAndCommand_Up(i).Caption="X"AndLabel_Down(i).BackColor=vbGreenThen'標(biāo)記雷錯(cuò)誤Command_Up(i).Picture=LoadPicture(App.Path+"\pictures\mine_wrong.gif",,,Command_Up(i).Width,Command_Up(i).Height)Command_Up(i).Visible=TrueLabel_Down(i).Visible=TrueElseCommand_Up(i).Visible=FalseLabel_Down(i).Visible=TrueEndIfNextitemp=MsgBox("恭喜,掃雷成功!"&vbCrLf&"耗時(shí):"&Mid(Label_Time.Caption,4)&vbCrLf&"鳴謝:平方XO(∩_∩)O~",vbOKOnly,"成功")EndIfContinue_Flag=0'提示一次后結(jié)束,防止在調(diào)用Command_Click事件中重復(fù)提示EndIfEndIfCommand_Start.SetFocusEndSubPrivateSubCommand_Start_Click()IfCommand_Start.Caption="開(kāi)始游戲"ThenCommand_Start.Caption="重新開(kāi)始"Continue_Flag=1Timer1.Enabled=TrueDifficulty=Val(Text_Difficulty.Text)/100Area_X=Val(Text_X.Text)Area_Y=Val(Text_Y.Text)Area=Area_X*Area_Y'初始化這里進(jìn)行二次初始化的原因是如果在之前的運(yùn)行中對(duì)字體進(jìn)行了改變,將有可能造成此處的控件大小發(fā)生變化WithPicture_show.Left=200.Top=200.Width=750*10.Height=750*10.Visible=FalseEndWithWithCommand_Up(0).Left=Picture_show.Left.Top=Picture_show.Top.Width=Picture_show.Width/10.Height=Picture_show.Height/10.FontSize=1'防止自動(dòng)縮放.Visible=FalseEndWithWithLabel_Down(0).Left=Picture_show.Left.Top=Picture_show.Top.Width=Picture_show.Width/10.Height=Picture_show.Height/10.FontSize=1'防止自動(dòng)縮放.Visible=FalseEndWithWithLabel_Down(0).Left=200.Top=200.Width=750*10/IIf(Area_X>Area_Y,Area_X,Area_Y).FontSize=25*(.Width/750)'會(huì)自動(dòng)縮放,必須先設(shè)置了.Height=750*10/IIf(Area_X>Area_Y,Area_X,Area_Y).Visible=FalseEndWithWithCommand_Up(0).Left=200.Top=200.Width=Label_Down(0).Width.Height=Label_Down(0).Height.Visible=FalseEndWithReDimNear_List(1To8)Near_List(1)=0-1-Area_YNear_List(2)=0-0-Area_YNear_List(3)=0+1-Area_YNear_List(4)=0-1Near_List(5)=0+1Near_List(6)=0-1+Area_YNear_List(7)=0-0+Area_YNear_List(8)=0+1+Area_Y'如果在列表中有相等的元素將有可能造成統(tǒng)計(jì)雷的數(shù)目錯(cuò)誤Fori=1To8Forj=i+1To8IfNear_List(i)=Near_List(j)ThenNear_List(i)=0NextjNextiArea_temp=0ForY=1ToArea_Y'加載labelForX=1ToArea_XArea_temp=Area_temp+1LoadLabel_Down(Area_temp)WithLabel_Down(Area_temp).Left=Label_Down(0).Left+Label_Down(0).Width*((Area_temp-1)ModArea_Y).Top=Label_Down(0).Top+Label_Down(0).Height*((Area_temp-1)\Area_Y).BackColor=vbGreen.Visible=False.Alignment=2.Font=.FontBoldEndWith'加載commandLoadCommand_Up(Area_temp)WithCommand_Up(Area_temp)'對(duì)列數(shù)求余的話就是在這一行第幾個(gè)了.Left=Command_Up(0).Left+Command_Up(0).Width*((Area_temp-1)ModArea_Y)'整除列數(shù)的話可以確定第幾行.Top=Command_Up(0).Top+Command_Up(0).Height*((Area_temp-1)\Area_Y).Visible=TrueEndWithNextXNextYReDimArea_List(1ToArea)Fori=1ToAreaArea_List(i)=iNexti'隨即布雷R(shí)andomizeMine_Count=Val(Text_Mine_Count.Text)Fori=1ToMine_CountCurrent_Mine=Int(Rnd*(UBound(Area_List)-LBound(Area_List)+1)+1)'在數(shù)組中隨機(jī)一個(gè),注意此處2個(gè)+1的必要性和準(zhǔn)確性Label_Down(Area_List(Current_Mine)).BackColor=vbRed'將該位置標(biāo)記為雷CallDelete_Item(Area_List,Current_Mine)'刪除該位置,防止再次標(biāo)記Nexti'檢查雷的數(shù)目Forj=1ToAreaIfLabel_Down(j).BackColor=vbRedThenLabel_Down(j).Caption="X"ElseMine_Number=0Fori=1To8'判斷控件是否存在Ifj+Near_List(i)>0Andj+Near_List(i)<=AreaThen'判斷是否相鄰IfAbs(Label_Down(j+Near_List(i)).Left-Label_Down(j).Left)<=Label_Down(j).WidthAndAbs(Label_Down(j+Near_List(i)).Top-Label_Down(j).Top)<=Label_Down(j).HeightThen'判斷是否有雷IfLabel_Down(j+Near_List(i)).BackColor=vbRedThenMine_Number=Mine_Number+1EndIfEndIfEndIfNextiLabel_Down(j).Caption=Mine_NumberEndIfNextjStart_Time=Now()ElseIfCommand_Start.Caption="重新開(kāi)始"ThenCallCommand_retry_ClickEndIfEndSubPrivateSubCommand_Up_MouseDown(IndexAsInteger,ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)IfButton=2ThenIfCommand_Up(Index).Caption=""ThenCommand_Up(Index).Caption="X"Command_Up(Index).Picture=LoadPicture(App.Path+"\pictures\mine.gif",,,Command_Up(Index).Width,Command_Up(Index).Height)ElseIfCommand_Up(Index).Caption="X"ThenCommand_Up(Index).Caption="?"Command_Up(Index).Picture=LoadPicture(App.Path+"\pictures\Unknown.gif",,,Command_Up(Index).Width,Command_Up(Index).Height)ElseIfCommand_Up(Index).Caption="?"ThenCommand_Up(Index).Caption=""Command_Up(Index).Picture=LoadPicture("")EndIfEndIfEndSubPrivateSubForm_Load()WithPicture_show.Left=200.Top=200.Width=750*10.Height=750*10.Visible=FalseEndWithWithCommand_Up(0).Left=Picture_show.Left.Top=Picture_show.Top.Width=Picture_show.Width/10.Height=Picture_show.Height/10.FontSize=1'防止自動(dòng)縮放.Visible=FalseEndWithWithLabel_Down(0).Left=Picture_show.Left.Top=Picture_show.Top.Width=Picture_show.Width/10.Height=Picture_show.Height/10.FontSize=1'防止自動(dòng)縮放.Visible=FalseEndWith'加載計(jì)時(shí)器Timer1.Enabled=FalseTimer1.Interval=100'加載滾動(dòng)條WithHScroll_Difficulty.LargeChange=5.SmallChange=1.Max=100.Min=0.Value=10EndWithWithHScroll_Area_X.LargeChange=5.SmallChange=1.Max=100.Min=1.Value=10EndWithWithHScroll_Area_Y.LargeChange=5.SmallChange=1.Max=100.Min=1.Value=10EndWithWithHScroll_Mine_Count.LargeChange=5.SmallChange=1.Max=100.Min=0.Value=10EndWith'由于很多數(shù)據(jù)不方便處理,索性讓其禁用了Text_Difficulty.Enabled=FalseText_Mine_Count.Enabled=FalseText_X.Enabled=FalseText_Y.Enabled=FalseEndSubPrivateSubHScroll_Area_X_Change()Text_X.Text=HScroll_Area_X.ValueHScroll_Mine_Count.Max=HScroll_Area_X.Value*HScroll_Area_Y.ValueHScroll_Mine_Count.Value=HScroll_Area_X.Value*HScroll_Area_Y.Value/100*HScroll_Difficulty.ValueEndSubPrivateSubHScroll_Area_X_Scroll()Text_X.Text=HScroll_Area_X.ValueHScroll_Mine_Count.Max=HScroll_Area_X.Value*HScroll_Area_Y.ValueHScroll_Mine_Count.Value=HScroll_Area_X.Value*HScroll_Area_Y.Value/100*HScroll_Difficulty.ValueEndSubPrivateSubHScroll_Area_Y_Change()Text_Y.Text=HScroll_Area_Y.ValueHScroll_Mine_Count.Max=HScroll_Area_X.Value*HScroll_Area_Y.ValueHScroll_Mine_Count.Value=HScroll_Area_X.Value*HScroll_Area_Y.Value/100*HScroll_Difficulty.ValueEndSubPrivateSubHScroll_Area_Y_Scroll()Text_Y.Text=HScroll_Area_Y.ValueHScroll_Mine_Count.Max=HScroll_Area_X.Value*HScroll_Area_Y.ValueHScroll_Mine_Count.Value=HScroll_Area_X.Value*HScroll_Area_Y.Value/100*HScroll_Difficulty.ValueEndSubPrivateSubHScroll_Difficulty_Change()Text_Difficulty.Text=HScroll_Difficulty.ValueHScroll_Mine_Count.Value=HScroll_Area_X.Value*HScroll_Area_Y.Value/100*HScroll_Difficulty.ValueEndSubPrivateSubHScroll_Difficulty_Scroll()Text_Difficulty.Text=HScroll_Difficulty.ValueHScroll_Mine_Count.Value=HScroll_Area_X.Value*HScroll_Area_Y.Value/100*HScroll_Difficulty.ValueEndSubPrivateSubHScroll_Mine_Count_Change()Text_Mine_Count.Text=HScroll_Mine_Count.ValueHScroll_Difficulty.Value=HScroll_Mine_Count.Value/(HScroll_Area_X.Value*HScroll_Area_Y.Value)*100EndSubPrivateSubHScroll_Mine_Count_Scroll()Text_Mine_Count.Text=HScroll_Mine_Count.ValueHScroll_Difficulty.Value=HScroll_Mine_Count.Value/(HScroll_Area_X.Value*HScroll_Area_Y.Value)*100EndSubPrivateSubLabel_Down_MouseUp(IndexAsInteger,ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)Fori=1To8'判斷控件是否存在IfIndex+Near_List(i)>0AndIndex+Near_List(i)<=AreaThen'判斷是否相鄰IfAbs(Label_Down(Index+Near_List(i)).Left-Label_Down(Index).Left)<=Label_Down(Index).WidthAndAbs(Label_Down(Index+Near_List(i)).Top-Label_Down(Index).Top)<=Label_Down(Index).HeightThen'判斷是否有標(biāo)記雷IfCommand_Up(Index+Near_List(i)).Caption<>"X"AndCommand_Up(Index+Near_List(i)).Caption<>"?"ThenCommand_Up(Index+Near_List(i)).Picture=LoadPicture("")EndIfEndIfEndIfNextiEndSubPrivateSublabel_down_MouseDown(IndexAsInteger,ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)IfLeftAndRight_Flag+Button=3Then'雙擊完成Mine_Number=Val(Label_Down(Index).Caption)Mark_mine_number=0Fori=1To8'判斷控件是否存在IfIndex+Near_List(i)>0AndIndex+Near_List(i)<=AreaThen'判斷是否相鄰IfAbs(Label_Down(Index+Near_List(i)).Left-Label_Down(Index).Left)<=Label_Down(Index).WidthAndAbs(Label_Down(Index+Near_List(i)).Top-Label_Down(Index).Top)<=Label_Down(Index).HeightThen'判斷是否有標(biāo)記雷IfCommand_Up(Index+Near_List(i)).Caption="X"ThenMark_mine_number=Mark_mine_number+1EndIfEndIfEndIfNextiIfVal(Label_Down(Index).Caption)-Mark_mine_number<=0Then'已全部標(biāo)出,自動(dòng)點(diǎn)開(kāi)Fori=1To8'判斷控件是否存在IfIndex+Near_List(i)>0AndIndex+Near_List(i)<=AreaThen'判斷是否相鄰IfAbs(Label_Down(Index+Near_List(i)).Left-Label_Down(Index).Left)<=Label_Down(Index).WidthAndAbs(Label_Down(Index+Near_List(i)).Top-Label_Down(Index).Top)<=Label_Down(Index).HeightThen'判斷是否有標(biāo)記雷IfCommand_Up(Index+Near_List(i)).Caption<>"X"ThenCallCommand_Up_Click(Index+Near_List(i))EndIfEndIfEndIfNextiElse'如果沒(méi)有全部標(biāo)注的話應(yīng)該顯示一下嘛Fori=1To8'判斷控件是否存在IfIndex+Near_List(i)>0AndIndex+Near_List(i)<=AreaThen'判斷是否相鄰IfAbs(Label_Down(Index+Near_List(i)).Left-Label_Down(Index).Left)<=Label_Down(Index).WidthAndAbs(Label_Down(Index+Near_List(i)).Top-Label_Down(Index).Top)<=Label_Down(Index).HeightThen'判斷是否有標(biāo)記雷IfCommand_Up(Index+Near_List(i)).Caption<>"X"ThenCommand_Up(Index+Near_List(i)).Picture=LoadPicture(App.Path+"\pictures\xia.gif",,,Command_Up(Index).Width,Command_Up(Index).Height)EndIfEndIfEndIfNextiEndIfElseLeftAndRight_Flag=Button'PrintLeftAndRight_FlagEndIfEndSubPrivateSubTimer1_Timer()LeftAndRight_Flag=0End_Time=Now()spend_time=(End_Time-Start_Time)*10^5Label_Time.Caption="時(shí)間:"&Format(Int(spend_time)\(60*60),"00")&":"&Format((Int(spend_time)Mod(60*60))\60,"00")&":"&Format(Int(spend_time)Mod60,"00")&"."&Format(Int((spend_time-Int(spend_time))*1000),"000")EndSub軟件截圖123附錄資料:不需要的可以自行刪除VBHOOK(鉤子)超級(jí)無(wú)敵詳細(xì)用法(介紹)hook是WINDOWS提供的一種消息處理機(jī)制,它使得程序員可以使用子過(guò)程來(lái)監(jiān)視系統(tǒng)消息,并在消息到達(dá)目標(biāo)過(guò)程前得到處理。
下面將介紹WINNDOWSHOOKS并且說(shuō)明如何在WINDOWS程序中使用它。關(guān)于HOOKS
使用HOOK將會(huì)降低系統(tǒng)效率,因?yàn)樗黾恿讼到y(tǒng)處量消息的工作量。建議在必要時(shí)才使用HOOK,并在消息處理完成后立即移去該HOOK。
HOOK鏈
WINDOWS提供了幾種不同類型的HOOKS;不同的HOOK可以處理不同的消息。例如,WH_MOUSEHOOK用來(lái)監(jiān)視鼠標(biāo)消息。
WINDOWS為這幾種HOOKS維護(hù)著各自的HOOK鏈。HOOK鏈?zhǔn)且粋€(gè)由應(yīng)用程序定義的回調(diào)函數(shù)隊(duì)列,當(dāng)某種類型的消息發(fā)生時(shí),WINDOWS向此種類型的HOOK鏈的第一個(gè)函數(shù)發(fā)送該消息,在第一函數(shù)處理完該消息后由該函數(shù)向鏈表中的下一個(gè)函數(shù)傳遞消息,依次向下。如果鏈中某個(gè)函數(shù)沒(méi)有向下傳送該消息,那么鏈表中后面的函數(shù)將得不到此消息。(對(duì)于某些類型的HOOK,不管HOOK鏈中的函數(shù)是否向下傳遞消息,與此類型HOOK聯(lián)系的所有HOOK函數(shù)都會(huì)收到系統(tǒng)發(fā)送的消息)
HOOK過(guò)程
為了攔截特定的消息,你可以使用SetWindowsHookEx函數(shù)在該類型的HOOK鏈中安裝你自己的HOOK函數(shù)。該函數(shù)語(yǔ)法如下:
publicfunctionMyHook(nCode,wParam,iParam)aslong
‘加入代碼
endfunction
其中MyHook可以隨便命名,其它不能變。該函數(shù)必須放在模塊段。nCode指定HOOK類型。wParam,iParam的取值隨nCode不同而不同,它代表了某種類型的HOOK的某個(gè)特定的動(dòng)作。
SetWindowsHookEx總是將你的HOOK函數(shù)放置在HOOK鏈的頂端。你可以使用CallNextHookEx函數(shù)將系統(tǒng)消息傳遞給HOOK鏈中的下一個(gè)函數(shù)。
[注釋]對(duì)于某些類型的HOOK,系統(tǒng)將向該類的所有HOOK函數(shù)發(fā)送消息,這時(shí),HOOK函數(shù)中的CallNextHookEx語(yǔ)句將被忽略。
全局HOOK函數(shù)可以攔截系統(tǒng)中所有線程的某個(gè)特定的消息(此時(shí)該HOOK函數(shù)必須放置在DLL中),局部HOOK函數(shù)可以攔截指定線程的某特定消息(此時(shí)該HOOK函數(shù)可以放置在DLL中,也可以放置在應(yīng)用程序的模塊段)。
[注釋]建議只在調(diào)試時(shí)使用全局HOOK函數(shù)。全局HOOK函數(shù)將降低系統(tǒng)效率,并且會(huì)同其它使用該類HOOK的應(yīng)用程序產(chǎn)生沖突。
HOOK類型
WH_CALLWNDPROC和WH_CALLWNDPROCRETHOOK
WH_CALLWNDPROC和WH_CALLWNDPROCRETHOOK可以監(jiān)視SendMessage發(fā)送的消息。系統(tǒng)在向窗體過(guò)程發(fā)送消息前,將調(diào)用WH_CALLWNDPROC;在窗體過(guò)程處理完該消息后系統(tǒng)將調(diào)用WH_CALLWNDPROCRET。
WH_CALLWNDPROCRETHOOK會(huì)向HOOK過(guò)程傳送一個(gè)CWPRETSTRUCT結(jié)構(gòu)的地址。該結(jié)構(gòu)包含了窗體過(guò)程處理系統(tǒng)消息后的一些信息。
WH_CBTHook
系統(tǒng)在激活,創(chuàng)建,消毀,最小化,最大化,移動(dòng),改變窗體前;在完成一條系統(tǒng)命令前;在從系統(tǒng)消息隊(duì)列中移去鼠標(biāo)或鍵盤事件前;在設(shè)置輸入焦點(diǎn)前,或同步系統(tǒng)消息隊(duì)列前,將調(diào)用WH_CBTHOOK。你可以在你的HOOK過(guò)程攔截該類HOOK,并返回一個(gè)值,告訴系統(tǒng),是否繼續(xù)執(zhí)行上面的操作。
WH_DEBUGHOOK
系統(tǒng)在調(diào)用與某種HOOK類型聯(lián)系的HOOK過(guò)程前,將調(diào)用WH_DEBUG,應(yīng)用程序可以使用該HOOK決定是否讓系統(tǒng)執(zhí)行某種類型的HOOK。
WH_FOREGROUNDIDLEHook
系統(tǒng)在空閑時(shí)調(diào)用該HOOK,在后臺(tái)執(zhí)行優(yōu)先權(quán)較低的應(yīng)用程序。
WH_GETMESSAGEHook
WH_GETMESSAGEHook使應(yīng)用程序可以攔截GetMessage或PeekMessage的消息。應(yīng)用程序使用WH_GETMESSAGEHOOK監(jiān)視鼠標(biāo)、鍵盤輸入和發(fā)送到隊(duì)列中的其它消息。
WH_JOURNALRECORDHook
WH_JOURNALRECORDHook使應(yīng)用程序可以監(jiān)視輸入事件。典型地,應(yīng)用程序使用該HOOK記錄鼠標(biāo)、鍵盤輸入事件以供以后回放。該HOOK是全局HOOK,并且不能在指定線程中使用。
WH_JOURNALPLAYBACKHook
`WH_JOURNALPLAYBACKHook使應(yīng)用程序可以向系統(tǒng)消息隊(duì)列中插入消息。該HOOK可以回放以前由WH_JOURNALRECORDHOOK錄制的鼠標(biāo)、鍵盤輸入事件。在WH_JOURNALPLAYBACKHook安裝到系統(tǒng)時(shí),鼠標(biāo)、鍵盤輸入事件將被屏蔽。該HOOK同樣是一個(gè)全局HOOK,不能在指定線程中使用。
WH_JOURNALPLAYBACKHook返回一個(gè)時(shí)間暫停值,它告訴系統(tǒng),在處理當(dāng)前回放的消息時(shí),系統(tǒng)等待百分之幾秒。這使得此HOOK可以控制在回放時(shí)的時(shí)間事件。
WH_KEYBOARDHook
WH_KEYBOARDHook使應(yīng)用程序可以監(jiān)視由GetMessage和PeekMessage返回的WM_KEYDOWN及WM_KEYUP消息。應(yīng)用程序使用該HOOK監(jiān)視發(fā)送到消息隊(duì)列中的鍵盤輸入。
WH_MOUSEHook
WH_MOUSEHook使應(yīng)用程序可以監(jiān)視由GetMessage和PeekMessage返回的消息。應(yīng)用程序使用該HOOK監(jiān)視發(fā)送到消息隊(duì)列中的鼠標(biāo)輸入。
WH_MSGFILTERandWH_SYSMSGFILTERHooks
WH_MSGFILTER和WH_SYSMSGFILTERHooks使應(yīng)用程序可以監(jiān)視菜單、滾動(dòng)條、消息框、對(duì)話框,當(dāng)用戶使用ALT+TAB或ALT+ESC來(lái)切換窗體時(shí),該HOOK也可以攔截到消息。WH_MSGFILTER僅在應(yīng)用程序內(nèi)部監(jiān)視菜單、滾動(dòng)條、消息框、對(duì)話框,而WH_SYSMSGFILTER則可以在系統(tǒng)內(nèi)監(jiān)視所有應(yīng)用程序的這些事件。
WH_SHELLHook
一個(gè)SHELL程序可以使用WH_SHELLHook來(lái)接收重要的信息。當(dāng)一個(gè)SHELL程序被激活前或當(dāng)前窗體被創(chuàng)建、消毀時(shí),系統(tǒng)會(huì)調(diào)用WH_SHELLHook過(guò)程。
使用HOOK
安裝、銷毀HOOK過(guò)程
監(jiān)視系統(tǒng)事件安裝、銷毀HOOK過(guò)程
使用SetWindowsHookEx函數(shù),指定一個(gè)HOOK類型,自己的HOOK過(guò)程是全局還是局部HOOK,同時(shí)給出HOOK過(guò)程的進(jìn)入點(diǎn),就可以輕松的安裝你自己的HOOK過(guò)程。DeclareFunctionSetWindowsHookExLib"user32"Alias"SetWindowsHookExA"_
(ByValidHookAsLong,_
ByVallpfnAsLong,
_
ByValhmodAsLong,
_
ByValdwThreadIdAsLong)AsLongidHook代表是何種Hook,有以下幾種
PublicConstWH_CALLWNDPROC=4
PublicConstWH_CALLWNDPROCRET=12
PublicConstWH_CBT=5
PublicConstWH_DEBUG=9
PublicConstWH_FOREGROUNDIDLE=11
PublicConstWH_GETMESSAGE=3
PublicConstWH_HARDWARE=8
PublicConstWH_JOURNALPLAYBACK=1
PublicConstWH_JOURNALRECORD=0
PublicConstWH_KEYBOARD=2
PublicConstWH_MOUSE=7
PublicConstWH_MSGFILTER=(-1)
PublicConstWH_SHELL=10
PublicConstWH_SYSMSGFILTER=6lpfn代表HookFunction所在的Address,這是一個(gè)CallBackFucnction,當(dāng)掛上某個(gè)Hook時(shí),我們便得定義一個(gè)Function來(lái)當(dāng)作某個(gè)訊息產(chǎn)生時(shí),來(lái)處理它的Function,這個(gè)HookFunction有一定的叁數(shù)格式
PrivateFunctionHookFunc(ByValnCodeAsLong,_
ByValwParamAsLong,_
ByVallParamAsLong)AsLong
nCode代表是什麼請(qǐng)況之下所產(chǎn)生的Hook,隨Hook的不同而有不同組的可能值。
wParamlParam傳回值則隨Hook的種類和nCode的值之不同而不同。
因這個(gè)叁數(shù)是一個(gè)Function的Address所以我們固定將HookFunction放在.Bas中,并以AddressOfHookFunc傳入。至於HookFunction的名稱我們可以任意給定,不一定叫HookFunchmod代表.DLL的hInstance,如果是LocalHook,該值可以是Null(VB中可傳0進(jìn)去),而如果是RemoteHook,則可以使用GetModuleHandle(".dll名稱")來(lái)傳入。dwThreadId代表執(zhí)行這個(gè)Hook的ThreadId,如果不設(shè)定是那個(gè)Thread來(lái)做,則傳0(所以一般來(lái)說(shuō),RemoteHook傳0進(jìn)去),而VB的LocalHook一般可傳App.ThreadId進(jìn)去。值回值如果SetWindowsHookEx()成功,它會(huì)傳回一個(gè)值,代表目前的Hook的Handle,這個(gè)值要記錄下來(lái)。因?yàn)锳程式可以有一個(gè)SystemHook(RemoteHook),如KeyBoardHook,而B(niǎo)程式也來(lái)設(shè)一個(gè)Remote的KeyBoardHook,那麼到底KeyBoard的訊息誰(shuí)所攔截?答案是,最後的那一個(gè)所攔截,也就是說(shuō)A先做keyboardHook,而後B才做,那訊息被B攔截,那A呢?就看B的HookFunction如何做。如果B想讓A的HookFunction也得這個(gè)訊息,那B就得呼叫CallNextHookEx()將這訊息Pass給A,於是產(chǎn)生Hook的一個(gè)連線。如果B中不想Pass這訊息給A,那就不要呼叫CallNextHookEx()。DeclareFunctionCallNextHookExLib"user32"Alias"CallNextHookEx"_
(ByValhHookAsLong,_
ByValncodeAsLong,_
ByValwParamAsLong,_
lParamAsAny)AsLonghHook值是SetWindowsHookEx()的傳回值,nCode,wParam,lParam則是HookProcedure中的三個(gè)叁數(shù)。最後是將這Hook去除掉,請(qǐng)呼叫UnHookWindowHookEx()DeclareFunctionUnhookWindowsHookExLib"user32"Alias"UnhookWindowsHookEx"
_
(ByValhHookAsLong)AsLonghHook便是SetWindowsHookEx()的傳回值。此時(shí),以上例來(lái)說(shuō),B程式結(jié)束Hook,則換A可以直接攔截訊息。
KeyBoardHook的范例HookFunction的三個(gè)叁數(shù)nCode
wParam
lParam
傳回值
HC_ACTION
表按鍵VirtualKey
與WM_KEYDOWN同若訊息要被處理傳0
或
反之傳1
HC_NOREMOVE
PublichHookasLongPublicSubUnHookKBD()
Ifhnexthookproc<>0Then
UnhookWindowsHookExhHook
hHook=0
EndIf
EndSubPublicFunctionEnableKBDHook()
IfhHook<>0Then
ExitFunction
EndIf
hhook=SetWindowsHookEx(WH_KEYBOARD,AddressOf_
MyKBHFunc,App.hInstance,App.ThreadId)
EndFunctionPublicFunctionMyKBHFunc(ByValiCodeAsLong,_
ByValwParamAsLong,ByVallParamAsLong)AsLong
MyKBHfunc=0'表示要處理這個(gè)訊息
IfwParam=vbKeySnapshotThen
'偵測(cè)有沒(méi)有按到PrintScreen鍵
MyKBHFunc=1'在這個(gè)Hook便吃掉這個(gè)訊息
EndIf
CallCallNextHookEx(hHook,iCode,wParam,lParam)'傳給下一個(gè)Hook
EndFunction鼠標(biāo)鉤子的示例列下。(1)模塊中輸入:PublicConstWM_MOUSEMOVE=&H200
PublicConstWM_LBUTTONDOWN=&H201
PublicConstWM_LBUTTONUP=&H202
PublicConstWM_LBUTTONDBLCLK=&H203
PublicConstWM_RBUTTONDOWN=&H204
PublicConstWM_RBUTTONUP=&H205
PublicConstWM_RBUTTONDBLCLK=&H206
PublicConstWM_MBUTTONDOWN=&H207
PublicConstWM_MBUTTONUP=&H208
PublicConstWM_MBUTTONDBLCLK=&H209
PublicConstWM_MOUSEACTIVATE=&H21
PublicConstWM_MOUSEFIRST=&H200
PublicConstWM_MOUSELAST=&H209
PublicConstWM_MOUSEWHEEL=&H20A
'以上是鼠標(biāo)的各個(gè)值
PrivateDeclareFunctionCallNextHookExLib"user32"(ByValhHookAsLong,ByValnCodeAsLong,ByValwParamAsLong,lparamAsAny)AsLongPublicFunctionHookProc(ByValnCodeAsLong,ByValwParamAsLong,ByVallparamAsLong)AsLong
IfnCode<0Then
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 汽車懸掛系統(tǒng)設(shè)計(jì)與性能評(píng)估考核試卷
- 玉米淀粉在制藥工業(yè)中的藥物載體與控釋系統(tǒng)考核試卷
- 一年級(jí)語(yǔ)文拼音過(guò)關(guān)練習(xí)題三篇
- 印刷項(xiàng)目管理與執(zhí)行考核試卷
- 竹材采運(yùn)市場(chǎng)趨勢(shì)預(yù)測(cè)與決策支持考核試卷
- 介紹春節(jié)初二語(yǔ)文作文
- 珠寶首飾企業(yè)戰(zhàn)略規(guī)劃考核試卷
- 生物多樣性展示教具考核試卷
- 糧油節(jié)能減排技術(shù)考核試卷
- 洗浴養(yǎng)生食療搭配考核試卷
- 金屬材料成形工藝及控制課件:軋制理論與工藝 (2)-
- 《我與集體共成長(zhǎng)》的主題班會(huì)
- 六年級(jí)趣味數(shù)學(xué)活動(dòng)課堂課件
- imo中的問(wèn)題定理與方法
- 新能源汽車運(yùn)用與維修專業(yè)人才培養(yǎng)方案
- 浙江公路技師學(xué)院教師招聘考試真題2022
- 氨吹脫塔單元設(shè)計(jì)示例
- 中國(guó)移動(dòng)-安全-L3
- GB/T 42314-2023電化學(xué)儲(chǔ)能電站危險(xiǎn)源辨識(shí)技術(shù)導(dǎo)則
- 人教小學(xué)數(shù)學(xué)五年級(jí)下冊(cè)綜合與實(shí)踐《怎樣通知最快》示范公開(kāi)課教學(xué)課件
- 海陸熱力性質(zhì)差異的說(shuō)課課件
評(píng)論
0/150
提交評(píng)論