版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
VB模擬掃雷游戲的嘗試編程目的那天老師展示了一個不完全的掃雷,激發(fā)了編程欲望,于是寫了掃雷來練練手。編程思路新建command_up和label_down,本來要用text_down,但是后來在左右鍵同時按下的時候與TextBox的enable沖突,于是改成label。用load加載控件根據(jù)雷區(qū)的X、Y、以及難度進(jìn)行隨機(jī)布雷。統(tǒng)計(jì)每一個label周圍雷的數(shù)量并作為label的caption。在單擊command的時候顯示label在右擊command的時候進(jìn)行標(biāo)記在label上左右鍵同時按下的時候檢查已標(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="開始游戲"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)記雷錯誤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)用的時候一定要避免陷入死循環(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)記雷錯誤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&"耗時:"&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="開始游戲"ThenCommand_Start.Caption="重新開始"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)行中對字體進(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'防止自動縮放.Visible=FalseEndWithWithLabel_Down(0).Left=Picture_show.Left.Top=Picture_show.Top.Width=Picture_show.Width/10.Height=Picture_show.Height/10.FontSize=1'防止自動縮放.Visible=FalseEndWithWithLabel_Down(0).Left=200.Top=200.Width=750*10/IIf(Area_X>Area_Y,Area_X,Area_Y).FontSize=25*(.Width/750)'會自動縮放,必須先設(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ù)目錯誤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)'對列數(shù)求余的話就是在這一行第幾個了.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'隨即布雷RandomizeMine_Count=Val(Text_Mine_Count.Text)Fori=1ToMine_CountCurrent_Mine=Int(Rnd*(UBound(Area_List)-LBound(Area_List)+1)+1)'在數(shù)組中隨機(jī)一個,注意此處2個+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="重新開始"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'防止自動縮放.Visible=FalseEndWithWithLabel_Down(0).Left=Picture_show.Left.Top=Picture_show.Top.Width=Picture_show.Width/10.Height=Picture_show.Height/10.FontSize=1'防止自動縮放.Visible=FalseEndWith'加載計(jì)時器Timer1.Enabled=FalseTimer1.Interval=100'加載滾動條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)出,自動點(diǎn)開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'如果沒有全部標(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="時間:"&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(鉤子)超級無敵詳細(xì)用法(介紹)hook是WINDOWS提供的一種消息處理機(jī)制,它使得程序員可以使用子過程來監(jiān)視系統(tǒng)消息,并在消息到達(dá)目標(biāo)過程前得到處理。
下面將介紹WINNDOWSHOOKS并且說明如何在WINDOWS程序中使用它。關(guān)于HOOKS
使用HOOK將會降低系統(tǒng)效率,因?yàn)樗黾恿讼到y(tǒng)處量消息的工作量。建議在必要時才使用HOOK,并在消息處理完成后立即移去該HOOK。
HOOK鏈
WINDOWS提供了幾種不同類型的HOOKS;不同的HOOK可以處理不同的消息。例如,WH_MOUSEHOOK用來監(jiān)視鼠標(biāo)消息。
WINDOWS為這幾種HOOKS維護(hù)著各自的HOOK鏈。HOOK鏈?zhǔn)且粋€由應(yīng)用程序定義的回調(diào)函數(shù)隊(duì)列,當(dāng)某種類型的消息發(fā)生時,WINDOWS向此種類型的HOOK鏈的第一個函數(shù)發(fā)送該消息,在第一函數(shù)處理完該消息后由該函數(shù)向鏈表中的下一個函數(shù)傳遞消息,依次向下。如果鏈中某個函數(shù)沒有向下傳送該消息,那么鏈表中后面的函數(shù)將得不到此消息。(對于某些類型的HOOK,不管HOOK鏈中的函數(shù)是否向下傳遞消息,與此類型HOOK聯(lián)系的所有HOOK函數(shù)都會收到系統(tǒng)發(fā)送的消息)
HOOK過程
為了攔截特定的消息,你可以使用SetWindowsHookEx函數(shù)在該類型的HOOK鏈中安裝你自己的HOOK函數(shù)。該函數(shù)語法如下:
publicfunctionMyHook(nCode,wParam,iParam)aslong
‘加入代碼
endfunction
其中MyHook可以隨便命名,其它不能變。該函數(shù)必須放在模塊段。nCode指定HOOK類型。wParam,iParam的取值隨nCode不同而不同,它代表了某種類型的HOOK的某個特定的動作。
SetWindowsHookEx總是將你的HOOK函數(shù)放置在HOOK鏈的頂端。你可以使用CallNextHookEx函數(shù)將系統(tǒng)消息傳遞給HOOK鏈中的下一個函數(shù)。
[注釋]對于某些類型的HOOK,系統(tǒng)將向該類的所有HOOK函數(shù)發(fā)送消息,這時,HOOK函數(shù)中的CallNextHookEx語句將被忽略。
全局HOOK函數(shù)可以攔截系統(tǒng)中所有線程的某個特定的消息(此時該HOOK函數(shù)必須放置在DLL中),局部HOOK函數(shù)可以攔截指定線程的某特定消息(此時該HOOK函數(shù)可以放置在DLL中,也可以放置在應(yīng)用程序的模塊段)。
[注釋]建議只在調(diào)試時使用全局HOOK函數(shù)。全局HOOK函數(shù)將降低系統(tǒng)效率,并且會同其它使用該類HOOK的應(yīng)用程序產(chǎn)生沖突。
HOOK類型
WH_CALLWNDPROC和WH_CALLWNDPROCRETHOOK
WH_CALLWNDPROC和WH_CALLWNDPROCRETHOOK可以監(jiān)視SendMessage發(fā)送的消息。系統(tǒng)在向窗體過程發(fā)送消息前,將調(diào)用WH_CALLWNDPROC;在窗體過程處理完該消息后系統(tǒng)將調(diào)用WH_CALLWNDPROCRET。
WH_CALLWNDPROCRETHOOK會向HOOK過程傳送一個CWPRETSTRUCT結(jié)構(gòu)的地址。該結(jié)構(gòu)包含了窗體過程處理系統(tǒng)消息后的一些信息。
WH_CBTHook
系統(tǒng)在激活,創(chuàng)建,消毀,最小化,最大化,移動,改變窗體前;在完成一條系統(tǒng)命令前;在從系統(tǒng)消息隊(duì)列中移去鼠標(biāo)或鍵盤事件前;在設(shè)置輸入焦點(diǎn)前,或同步系統(tǒng)消息隊(duì)列前,將調(diào)用WH_CBTHOOK。你可以在你的HOOK過程攔截該類HOOK,并返回一個值,告訴系統(tǒng),是否繼續(xù)執(zhí)行上面的操作。
WH_DEBUGHOOK
系統(tǒng)在調(diào)用與某種HOOK類型聯(lián)系的HOOK過程前,將調(diào)用WH_DEBUG,應(yīng)用程序可以使用該HOOK決定是否讓系統(tǒng)執(zhí)行某種類型的HOOK。
WH_FOREGROUNDIDLEHook
系統(tǒng)在空閑時調(diào)用該HOOK,在后臺執(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)時,鼠標(biāo)、鍵盤輸入事件將被屏蔽。該HOOK同樣是一個全局HOOK,不能在指定線程中使用。
WH_JOURNALPLAYBACKHook返回一個時間暫停值,它告訴系統(tǒng),在處理當(dāng)前回放的消息時,系統(tǒng)等待百分之幾秒。這使得此HOOK可以控制在回放時的時間事件。
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)用戶使用ALT+TAB或ALT+ESC來切換窗體時,該HOOK也可以攔截到消息。WH_MSGFILTER僅在應(yīng)用程序內(nèi)部監(jiān)視菜單、滾動條、消息框、對話框,而WH_SYSMSGFILTER則可以在系統(tǒng)內(nèi)監(jiān)視所有應(yīng)用程序的這些事件。
WH_SHELLHook
一個SHELL程序可以使用WH_SHELLHook來接收重要的信息。當(dāng)一個SHELL程序被激活前或當(dāng)前窗體被創(chuàng)建、消毀時,系統(tǒng)會調(diào)用WH_SHELLHook過程。
使用HOOK
安裝、銷毀HOOK過程
監(jiān)視系統(tǒng)事件安裝、銷毀HOOK過程
使用SetWindowsHookEx函數(shù),指定一個HOOK類型,自己的HOOK過程是全局還是局部HOOK,同時給出HOOK過程的進(jìn)入點(diǎn),就可以輕松的安裝你自己的HOOK過程。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,這是一個CallBackFucnction,當(dāng)掛上某個Hook時,我們便得定義一個Function來當(dāng)作某個訊息產(chǎn)生時,來處理它的Function,這個HookFunction有一定的叁數(shù)格式
PrivateFunctionHookFunc(ByValnCodeAsLong,_
ByValwParamAsLong,_
ByVallParamAsLong)AsLong
nCode代表是什麼請況之下所產(chǎn)生的Hook,隨Hook的不同而有不同組的可能值。
wParamlParam傳回值則隨Hook的種類和nCode的值之不同而不同。
因這個叁數(shù)是一個Function的Address所以我們固定將HookFunction放在.Bas中,并以AddressOfHookFunc傳入。至於HookFunction的名稱我們可以任意給定,不一定叫HookFunchmod代表.DLL的hInstance,如果是LocalHook,該值可以是Null(VB中可傳0進(jìn)去),而如果是RemoteHook,則可以使用GetModuleHandle(".dll名稱")來傳入。dwThreadId代表執(zhí)行這個Hook的ThreadId,如果不設(shè)定是那個Thread來做,則傳0(所以一般來說,RemoteHook傳0進(jìn)去),而VB的LocalHook一般可傳App.ThreadId進(jìn)去。值回值如果SetWindowsHookEx()成功,它會傳回一個值,代表目前的Hook的Handle,這個值要記錄下來。因?yàn)锳程式可以有一個SystemHook(RemoteHook),如KeyBoardHook,而B程式也來設(shè)一個Remote的KeyBoardHook,那麼到底KeyBoard的訊息誰所攔截?答案是,最後的那一個所攔截,也就是說A先做keyboardHook,而後B才做,那訊息被B攔截,那A呢?就看B的HookFunction如何做。如果B想讓A的HookFunction也得這個訊息,那B就得呼叫CallNextHookEx()將這訊息Pass給A,於是產(chǎn)生Hook的一個連線。如果B中不想Pass這訊息給A,那就不要呼叫CallNextHookEx()。DeclareFunctionCallNextHookExLib"user32"Alias"CallNextHookEx"_
(ByValhHookAsLong,_
ByValncodeAsLong,_
ByValwParamAsLong,_
lParamAsAny)AsLonghHook值是SetWindowsHookEx()的傳回值,nCode,wParam,lParam則是HookProcedure中的三個叁數(shù)。最後是將這Hook去除掉,請呼叫UnHookWindowHookEx()DeclareFunctionUnhookWindowsHookExLib"user32"Alias"UnhookWindowsHookEx"
_
(ByValhHookAsLong)AsLonghHook便是SetWindowsHookEx()的傳回值。此時,以上例來說,B程式結(jié)束Hook,則換A可以直接攔截訊息。
KeyBoardHook的范例HookFunction的三個叁數(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'表示要處理這個訊息
IfwParam=vbKeySnapshotThen
'偵測有沒有按到PrintScreen鍵
MyKBHFunc=1'在這個Hook便吃掉這個訊息
EndIf
CallCallNextHookEx(hHook,iCode,wParam,lParam)'傳給下一個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)的各個值
PrivateDeclareFunctionCallNextHookExLib"user32"(ByValhHookAsLong,ByValnCodeAsLong,ByValwParamAsLong,lparamAsAny)AsLongPublicFunctionHookProc(ByValnCodeAsLong,ByValwParamAsLong,ByVallparamAsLong)AsLong
IfnCode<0Then
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國城市公共汽車客運(yùn)行業(yè)發(fā)展前景及投資規(guī)劃研究報告版
- 2024-2030年中國地毯行業(yè)競爭格局及未來投資趨勢分析報告
- 2024-2030年中國國際貨代行業(yè)未來發(fā)展趨勢及投資風(fēng)險分析報告
- 2024年度物聯(lián)網(wǎng)(IoT)設(shè)備控制系統(tǒng)軟件開發(fā)合同技術(shù)集成與擴(kuò)展2篇
- 茂名職業(yè)技術(shù)學(xué)院《國學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年深圳子女撫養(yǎng)權(quán)協(xié)議書樣本3篇
- 中國日報2019年9月25日
- 馬鞍山職業(yè)技術(shù)學(xué)院《美術(shù)基礎(chǔ)與欣賞》2023-2024學(xué)年第一學(xué)期期末試卷
- 呂梁學(xué)院《信息安全綜合》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年度醫(yī)院護(hù)工工作環(huán)境與職業(yè)健康保護(hù)協(xié)議下載3篇
- 焊工工藝學(xué)(A)試卷
- 高級英語(1)智慧樹知到答案章節(jié)測試2023年齊魯工業(yè)大學(xué)
- 脫不花三十天溝通訓(xùn)練營
- 機(jī)床操作說明書
- 義務(wù)教育物理課程標(biāo)準(zhǔn)(2022年版)測試卷(含答案)
- NY/T 396-2000農(nóng)用水源環(huán)境質(zhì)量監(jiān)測技術(shù)規(guī)范
- GB/T 39901-2021乘用車自動緊急制動系統(tǒng)(AEBS)性能要求及試驗(yàn)方法
- GB/T 36652-2018TFT混合液晶材料規(guī)范
- 國際商務(wù)談判 袁其剛課件 第四章-國際商務(wù)談判的結(jié)構(gòu)和過程
- 國際商法教案(20092新版)
- 江蘇開放大學(xué)漢語作為第二語言教學(xué)概論期末復(fù)習(xí)題
評論
0/150
提交評論