版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
VB學(xué)生信息管理系統(tǒng)及源代碼OptionExplicit'標(biāo)識(shí)是否能關(guān)閉DimmbCloseAsBoolean'標(biāo)識(shí)當(dāng)前要顯示的照片的文件DimmstrFileNameAsStringPrivateSubForm_Load()OnErrorResumeNextIffrmMain.mnUserType=1Then'學(xué)生用戶fraSeek.Enabled=FalsefraBrowse.Enabled=FalsecmdAdd.Enabled=FalsecmdDelete.Enabled=FalsetxtSerial.Enabled=FalsedcbClass.Enabled=FalsegrdScan.Enabled=FalseIfNot(DataEnv.rsStudent.EOFAndDataEnv.rsStudent.BOF)ThenDimTempAsStringTemp="name="&"'"&frmMain.msUserName&"'"DataEnv.rsStudent.MoveFirstDataEnv.rsStudent.FindTemp'刷新所綁定的控件CallRefreshBindingEndIfExitSubElsefraSeek.Enabled=TruefraBrowse.Enabled=TruecmdAdd.Enabled=TruecmdDelete.Enabled=TruetxtSerial.Enabled=TruedcbClass.Enabled=TruegrdScan.Enabled=TrueEndIfDimrsDepAsNewADODB.Recordset,rsClassAsNewADODB.RecordsetSetrsDep=DataEnv.rsDepartmentSetrsClass=DataEnv.rsClassrsDep.Open'從Department表中讀取數(shù)據(jù),填充cboDep組合框到中cboDep.ClearcboDep.AddItem"全部"'將各個(gè)系的id號(hào)作為ItemData附加到組合框中cboDep.ItemData(0)=0WhileNotrsDep.EOFcboDep.AddItemrsDep("Name")cboDep.ItemData(cboDep.ListCount-1)=rsDep("id")rsDep.MoveNextWendcboDep.ListIndex=0''從class表中讀取數(shù)據(jù),填充到cboClass組合框中cboClass.ClearcboClass.AddItem"全部"WhileNotrsClass.EOFcboClass.AddItemrsClass("Name")rsClass.MoveNextWendcboClass.ListIndex=0cmdList.Value=TruefraManage.Enabled=TruembClose=True'調(diào)用grdScan_Change事件顯示記錄明細(xì)CallgrdScan_ChangeEndSub'當(dāng)DataEnv.rsStudent的當(dāng)前記錄發(fā)生變化時(shí),刷新所綁定的控件(用戶改變了當(dāng)前記錄)SubRefreshBinding()OnErrorResumeNextWithDataEnv.rsStudentIfDataEnv.rssqlSeek.BOFAndDataEnv.rssqlSeek.EOFThen'如果不存在任何記錄,則清空所有的綁定的內(nèi)容txtSerial=""txtName=""dtpBirth.Value=""txtTelephone=""txtAddress=""txtResume=""imgPhoto.Picture=LoadPicture(Null)Else'否則和相應(yīng)的字段進(jìn)行綁定txtSerial=.Fields("serial")txtName=.Fields("name")dtpBirth.Value=.Fields("birthday")txtTelephone=.Fields("tel")txtAddress=.Fields("address")txtResume=.Fields("resume")cboSex.Text=.Fields("sex")dcbClass.Text=.Fields("class")imgPhoto.Picture=LoadPicture(ReadImage(.Fields("photo")))EndIfEndWithEndSub''在DataEnv.rsStudent中查詢serial為sSerial的學(xué)籍信息SubSeekStudent(sSerialAsString)IfNot(DataEnv.rsStudent.EOFAndDataEnv.rsStudent.BOF)ThenDimTempAsStringTemp="serial="&"'"&sSerial&"'"DataEnv.rsStudent.MoveFirstDataEnv.rsStudent.FindTemp'刷新所綁定的控件CallRefreshBindingEndIfEndSub''當(dāng)改變記錄集時(shí),需要刷新用戶導(dǎo)航的網(wǎng)格控件SubRefreshGrid()grdScan.DataMember=""grdScan.RefreshDataEnv.rssqlSeek.RequerygrdScan.DataMember="sqlSeek"grdScan.Refresh'刷新各個(gè)綁定控件CallgrdScan_ChangeEndSub''用以在瀏覽時(shí),根據(jù)當(dāng)前記錄所出的位置不同,來(lái)改變各個(gè)瀏覽按鈕的狀態(tài)SubChangeBrowseState()WithDataEnv.rssqlSeekIf.State=adStateClosedThen.Open'如果沒(méi)有任何記錄,使某些按鈕無(wú)效;否則則使這些按鈕有效If.BOFAnd.EOFThencmdAdd.Enabled=TruecmdEdit.Enabled=FalsecmdDelete.Enabled=FalsecmdUpdate.Enabled=FalsecmdReport.Enabled=FalsefraBrowse.Enabled=FalseElsecmdAdd.Enabled=TruecmdEdit.Enabled=TruecmdDelete.Enabled=TruecmdUpdate.Enabled=FalsecmdReport.Enabled=TruefraBrowse.Enabled=TrueEndIf''假如處于記錄的頭部If.BOFThenIfNot.EOFThenDataEnv.rsStudent.MoveFirstcmdPrevious.Enabled=FalsecmdFirst.Enabled=FalseElsecmdPrevious.Enabled=TruecmdFirst.Enabled=TrueEndIf''假如處于記錄的尾部If.EOFThenIfNot.BOFThenDataEnv.rsStudent.MoveLastcmdNext.Enabled=FalsecmdLast.Enabled=FalseElsecmdNext.Enabled=TruecmdLast.Enabled=TrueEndIfEndWithmstrFileName=""EndSubPrivateSubcboDep_Click()DimrsClassAsNewADODB.RecordsetDimstrSQL'根據(jù)所選的系的不同,采用不同的SQL語(yǔ)句IfcboDep.ItemData(cboDep.ListIndex)=0ThenstrSQL="select*from班級(jí)信息表"ElsestrSQL="select*from班級(jí)信息表wheredept_id="&cboDep.ItemData(cboDep.ListIndex)EndIfrsClass.OpenstrSQL,DataEnv.Con'將所查到的rsClass中的內(nèi)容來(lái)填充cboClasscboClass.ClearcboClass.AddItem"全部"WhileNotrsClass.EOFcboClass.AddItemrsClass("Name")rsClass.MoveNextWendcboClass.ListIndex=0rsClass.CloseSetrsClass=NothingEndSubPrivateSubcmdAdd_Click()'添加記錄fraSeek.Enabled=FalsefraBrowse.Enabled=FalsegrdScan.Enabled=FalseDataEnv.rsStudent.AddNewdtpBirth.Value="1980-01-01"fraInfo.Enabled=TruefraBrowse.Enabled=FalsecmdAdd.Enabled=FalsecmdEdit.Enabled=FalsecmdDelete.Enabled=FalsecmdUpdate.Enabled=TruecmdReport.Caption="取消"cmdReport.Enabled=TruembClose=False'不能關(guān)閉窗口EndSubPrivateSubcmdDelete_Click()'如果出錯(cuò),則顯示錯(cuò)誤代碼OnErrorGoToerrHandlerIfMsgBox("要?jiǎng)h除記錄?",vbYesNo+vbQuestion+vbDefaultButton2,"確認(rèn)")=vbYesThen'通過(guò)在DataEnv.Con中執(zhí)行SQL命令,來(lái)刪除記錄DataEnv.Con.Execute"deletefrom學(xué)生信息表whereserial='"&txtSerial&"'"DataEnv.rsStudent.MoveNextIfDataEnv.rsStudent.EOFThenDataEnv.rsStudent.MoveLast'刷新用戶導(dǎo)航的網(wǎng)格控件CallRefreshGridEndIfExitSuberrHandler:MsgBoxErr.Description,vbCritical,"錯(cuò)誤"EndSubPrivateSubcmdEdit_Click()'編輯記錄之前,需要設(shè)置其他控件的Enabled屬性fraSeek.Enabled=FalsefraBrowse.Enabled=FalsegrdScan.Enabled=FalsefraInfo.Enabled=TruecmdAdd.Enabled=FalsecmdEdit.Enabled=FalsecmdDelete.Enabled=FalsecmdUpdate.Enabled=TruecmdReport.Caption="取消"''更改cmdReport標(biāo)題cmdReport.Enabled=TruembClose=False'出于編輯狀態(tài),則用戶不能關(guān)閉窗口EndSubPrivateSubcmdFirst_Click()'移動(dòng)到記錄的頭部,并改變各個(gè)瀏覽按鈕的狀態(tài)DataEnv.rssqlSeek.MoveFirstDataEnv.rssqlSeek.MovePreviousCallChangeBrowseStateEndSubPrivateSubcmdLast_Click()'移動(dòng)到記錄的尾部,并改變各個(gè)瀏覽按鈕的狀態(tài)DataEnv.rssqlSeek.MoveLastDataEnv.rssqlSeek.MoveNextCallChangeBrowseStateEndSubPrivateSubcmdList_Click()'針對(duì)所選的班級(jí),列出班級(jí)中所有的學(xué)籍信息DimstrSQLIfcboClass.Text="全部"ThenstrSQL="from學(xué)生信息表orderbyserial"ElsestrSQL="from學(xué)生信息表whereclass='"&cboClass&"'orderbyserial"EndIfDataEnv.rsStudent.CloseDataEnv.rsStudent.Open"select*"&strSQLDataEnv.rssqlSeek.CloseDataEnv.rssqlSeek.Open"selectserial,name"&strSQL'刷新用戶導(dǎo)航的網(wǎng)格控件,并且根據(jù)記錄集中記錄的數(shù)目,來(lái)改變各個(gè)瀏覽按鈕的狀態(tài)。CallRefreshGridCallChangeBrowseStateCallgrdScan_ChangeEndSubPrivateSubcmdNext_Click()'移動(dòng)到記錄的下一條DataEnv.rssqlSeek.MoveNextCallChangeBrowseStateEndSubPrivateSubcmdPrevious_Click()'移動(dòng)到記錄的上一條DataEnv.rssqlSeek.MovePreviousCallChangeBrowseStateEndSubPrivateSubcmdReport_Click()OnErrorResumeNextIfcmdReport.Caption="取消"Then'取消所使用的更新更新DataEnv.rsStudent.CancelUpdate'重新顯示原來(lái)數(shù)據(jù)集中的內(nèi)容IfDataEnv.rsStudent.BOFThenDataEnv.rsStudent.MoveFirstElseDataEnv.rsStudent.MovePreviousDataEnv.rsStudent.MoveNextEndIfCallRefreshBindingCallChangeBrowseStatefraSeek.Enabled=TruefraBrowse.Enabled=TruefraInfo.Enabled=FalsegrdScan.Enabled=TruecmdReport.Caption="報(bào)表(R)"mbClose=TrueElse'生成報(bào)表DimstrSQLAsStringDataEnv.rsrptStudent.ClosestrSQL="select*from學(xué)生信息表whereserial='"&txtSerial.Text&"'"DataEnv.rsrptStudent.OpenstrSQLrptStudent.ShowEndIfEndSubPrivateSubcmdSelectPhoto_Click()OnErrorGoToerrHandler:dlgSelect.DialogTitle="選擇該學(xué)生的照片"dlgSelect.Filter="所有圖形文件|*.bmp;*.dib;*.gif;*.jpg;*.ico|位圖文件(*.bmp;*.dib)"&_"|*.bmp;*.dib|GIF文件(*.gif)|*.gif|JPEG文件(*.jpg)|*.jpg|圖標(biāo)文件(*.ico)|*.ico"dlgSelect.ShowOpenIfdlgSelect.FileName=""ThenExitSubimgPhoto.Picture=LoadPicture(dlgSelect.FileName)mstrFileName=dlgSelect.FileNameExitSuberrHandler:MsgBoxErr.Description,vbCritical,"錯(cuò)誤"EndSubPrivateSubcmdUpdate_Click()'更新所添加或者修改的記錄OnErrorGoToerrHandler:DimstrAsStringstr=txtSerial.TextWithDataEnv.rsStudent.Fields("Serial")=txtSerial.Text.Fields("name")=txtName.Text.Fields("sex")=cboSex.Text.Fields("class")=dcbClass.Text.Fields("birthday")=dtpBirth.Value.Fields("tel")=txtTelephone.Text.Fields("address")=txtAddress.Text.Fields("resume")=txtResume.TextIfmstrFileName<>""ThenCallWriteImage(.Fields("photo"),mstrFileName).UpdateEndWithcmdReport.Caption="報(bào)表(&R)"cmdUpdate.Enabled=FalsefraInfo.Enabled=FalsembClose=TrueIfDataEnv.rssqlSeek.State=adStateClosedThenDataEnv.rssqlSeek.Open'刷新右端用以導(dǎo)航的網(wǎng)格控件CallRefreshGrid'根據(jù)記錄集中記錄的個(gè)數(shù),改變各個(gè)按鈕的狀態(tài)CallChangeBrowseState'定位到剛剛添加或者修改過(guò)的記錄DataEnv.rssqlSeek.MoveFirstDataEnv.rssqlSeek.Find"serial='"&str&"'"fraSeek.Enabled=TruefraBrowse.Enabled=TruegrdScan.Enabled=TrueExitSuberrHandler:MsgBoxErr.Description,vbCritical,"錯(cuò)誤"EndSubPrivateSubdcbClass_Click(AreaAsInteger)IftxtSerial=""ThentxtSerial=dcbClass.TextEndIfEndSubPrivateSubForm_QueryUnload(CancelAsInteger,UnloadModeAsInteger)IfNotmbCloseThenMsgBox"數(shù)據(jù)正被修改,窗口不能關(guān)閉",vbCritical,"錯(cuò)誤"Cancel=TrueEndIfEndSubPrivateSubfraInfo_DragDrop(SourceAsControl,XAsSingle,YAsSingle)EndSubPrivateSubgrdScan_Change()IfgrdScan.ApproxCount>0ThenCallSeekStudent(grdScan.Columns(0).CellText(grdScan.Bookmark))EndIfEndSubPrivateSubgrdScan_RowColChange(LastRowAsVariant,ByValLastColAsInteger)'當(dāng)前行改變,則動(dòng)態(tài)改變所要顯示的記錄IfLastRow<>grdScan.BookmarkThenIfgrdScan.ApproxCount>0ThenCallSeekStudent(grdScan.Columns(0).CellText(grdScan.Bookmark))EndIfEndIfEndSubPrivateSubWriteImage(ByRefFldAsADODB.Field,DiskFileAsString)DimbyteData()AsByte'定義數(shù)據(jù)塊數(shù)組DimNumBlocksAsLong'定義數(shù)據(jù)塊個(gè)數(shù)DimFileLengthAsLong'標(biāo)識(shí)文件長(zhǎng)度DimLeftOverAsLong'定義剩余字節(jié)長(zhǎng)度DimSourceFileAsLong'定義自由文件號(hào)DimiAsLong'定義循環(huán)變量ConstBLOCKSIZE=4096'每次讀寫(xiě)塊的大小SourceFile=FreeFile'提供一個(gè)尚未使用的文件號(hào)OpenDiskFileForBinaryAccessReadAsSourceFile'打開(kāi)文件FileLength=LOF(SourceFile)'得到文件長(zhǎng)度IfFileLength=0Then'判斷文件是否存在CloseSourceFileMsgBoxDiskFile&"無(wú)內(nèi)容或不存在!"ElseNumBlocks=FileLength\BLOCKSIZE'得到數(shù)據(jù)塊的個(gè)數(shù)LeftOver=FileLengthModBLOCKSIZE'得到剩余字節(jié)數(shù)Fld.Value=NullReDimbyteData(BLOCKSIZE)'重新定義數(shù)據(jù)塊的大小Fori=1ToNumBlocksGetSourceFile,,byteData()'讀到內(nèi)存塊中Fld.AppendChunkbyteData()'寫(xiě)入FLDNextiReDimbyteData(LeftOver)'重新定義數(shù)據(jù)塊的大小GetSourceFile,,byteData()'讀到內(nèi)存塊中Fld.AppendChunkbyteData()'寫(xiě)入FLDCloseSourceFile'關(guān)閉源文件EndIfEndSubPrivateFunctionReadImage(blobColumnAsADODB.Field)AsString'取得一個(gè)臨時(shí)性文件DimstrFileNameAsStringstrFileName="ImageTmp"DimFileNumberAsInteger'文件號(hào)DimDataLenAsLong'文件長(zhǎng)度DimChunksAsLong'數(shù)據(jù)塊數(shù)DimChunkAry()AsByte'數(shù)據(jù)塊數(shù)組DimChunkSizeAsLong'數(shù)據(jù)塊大小DimFragmentAsLong'零碎數(shù)據(jù)大小DimlngIAsLong'計(jì)數(shù)器OnErrorGoToerrHanderChunkSize=2048'定義塊大小為2KIfIsNull(blobColumn)ThenExitFunctionDataLen=blobColumn.ActualSize'獲得圖像大小IfDataLen<8ThenExitFunction'圖像大小小于8字節(jié)時(shí)認(rèn)為不是圖像信息FileNumber=FreeFile'產(chǎn)生隨機(jī)的文件號(hào)OpenstrFileNameForBinaryAccessWriteAsFileNumber'打開(kāi)存放圖像數(shù)據(jù)文件Chunks=DataLen\ChunkSize'數(shù)據(jù)塊數(shù)Fragment=DataLenModChunkSize'零碎數(shù)據(jù)IfFragment>0Then'有零碎數(shù)據(jù),則先讀該數(shù)據(jù)ReDimChunkAry(Fragment-1)ChunkAry=blobColumn.GetChunk(Fragment)PutFileNumber,,ChunkAry'寫(xiě)入文件EndIfReDimChunkAry(ChunkSize-1)'為數(shù)據(jù)塊重新開(kāi)辟空間ForlngI=1ToChunks'循環(huán)讀出所有塊ChunkAry=blobColumn.GetChunk(ChunkSize)'在數(shù)據(jù)庫(kù)中連續(xù)讀數(shù)據(jù)塊PutFileNumber,,ChunkAry()'將數(shù)據(jù)塊寫(xiě)入文件中NextlngICloseFileNumber'關(guān)閉文件ReadImage=strFileNameExitFunctionerrHander:ReadImage=""EndFunctionPrivateSubimgPhoto_Click()EndSubOptionExplicit'表示當(dāng)前的用戶類(lèi)型:0管理員類(lèi)型的用戶;1學(xué)生類(lèi)型的用戶PublicmnUserTypeAsInteger'表示當(dāng)前登錄的用戶名PublicmsUserNameAsStringPrivateSubMDIForm_Load()'根據(jù)不同的用戶類(lèi)型,使相應(yīng)的菜單項(xiàng)可見(jiàn)SelectCasemnUserTypeCase0:'以管理員身份登錄mnuFind.Visible=TruetlbMain.Buttons.Item(3).Visible=TruetlbMain.Buttons.Item(4).Visible=TrueExitSubCase1:'以學(xué)生身份登錄,只能查詢自己的信息mnuFind.Visible=False'“信息查詢”菜單不可見(jiàn)tlbMain.Buttons.Item(3).Visible=False'“信息查詢”按鈕不可見(jiàn)tlbMain.Buttons.Item(4).Visible=False'第二個(gè)分隔條不可見(jiàn)ExitSubEndSelectEndSubPrivateSubMDIForm_QueryUnload(CancelAsInteger,UnloadModeAsInteger)IfMsgBox("真的要對(duì)出本系統(tǒng)嗎?",vbQuestion+vbYesNo+vbDefaultButton2,"退出")=vbNoThenCancel=1EndIfEndSubPrivateSubmnuAbout_Click()LoadfrmSplashfrmSplash.mbAbout=TruefrmSplash.ShowvbModalEndSubPrivateSubmnuArr_Click()frmMain.Arrange(3)'設(shè)置主窗體中所有最小化MDI子窗體圖標(biāo)重排EndSubPrivateSubmnuCas_Click()frmMain.Arrange(0)'設(shè)置主窗體中所有非最小化MDI子窗體層疊顯示EndSubPrivateSubmnuExit_Click()UnloadMeEndSubPrivateSubmnuFind_Click()frmFind.ShowEndSubPrivateSubmnuHori_Click()frmMain.Arrange(1)'設(shè)置主窗體中所有非最小化MDI子窗體水平平鋪EndSubPrivateSubmnuLog_Click()IfMsgBox("若重新登錄,所有窗體都將關(guān)閉!"&vbCrLf&"是否重新登錄?",_vbQuestion+vbYesNo+vbDefaultButton2,"重新登錄")=vbYesThenUnloadMefrmLogin.ShowEndIfEndSubPrivateSubmnuStudent_Click()LoadfrmStudentfrmStudent.ShowEndSubPrivateSubmnuVer_Click()frmMain.Arrange(2)'設(shè)置主窗體中所有非最小化MDI子窗體垂直平鋪EndSubPrivateSubtlbMain_ButtonClick(ByValButtonAsMSComctlLib.Button)SelectCaseButton.KeyCase"Student"mnuStudent_ClickExitSubCase"Find"mnuFind_ClickExitSubCase"Login"mnuLog_ClickExitSubCase"Exit"mnuExit_ClickExitSubEndSelectEndSubOptionExplicit'表示當(dāng)前用戶登錄所選擇的身份,即用戶類(lèi)型,0-表示教務(wù)管理人員;1-表示學(xué)生DimmnUserTypeAsIntegerPrivateSubcmdCancel_Click()UnloadMeEndSubPrivateSubcmdOK_Click()'取得用戶輸入的用戶名和密碼DimuserAsString,pwdAsStringuser=Trim(txtUser)pwd=Trim(txtPwd)'根據(jù)不同的身份,選擇不同的表用以查詢DimrAsNewADODB.RecordsetSetr=DataEnv.rssqlSeekDimstrSQLAsStringSelectCasemnUserTypeCase0:'若身份為管理員strSQL="select*from系統(tǒng)人員表wherename='"&user&"'andpwd='"&pwd&"'"Case1:'若身份為學(xué)生strSQL="select*from學(xué)生信息表wherename='"&user&"'andserial='"&pwd&"'"EndSelectOnErrorResumeNext'查詢DataEnv.rssqlSeek的狀態(tài),如果已經(jīng)打開(kāi),則先關(guān)閉Ifr.State=adStateOpenThenr.Closer.OpenstrSQL'根據(jù)strSQL的內(nèi)容刷新DataEnv.rssqlSeek'用戶密碼錯(cuò)誤的次數(shù),如果錯(cuò)誤次數(shù)超過(guò)3次,則退出系統(tǒng)StaticnTryCountAsIntegerIfr.EOFThen'登錄失敗MsgBox"對(duì)不起,無(wú)此用戶或者密碼不正確!請(qǐng)重新輸入?。?,vbCritical,"錯(cuò)誤"txtUser.SetFocustxtUser.SelStart=0txtUser.SelLength=Len(txtUser)nTryCount=nTryCount+1IfnTryCount>=3ThenMsgBox"您無(wú)權(quán)操作本系統(tǒng)!",vbCritical,"錯(cuò)誤"UnloadMeEndIfElse'登陸成功'顯示MDI窗體,并將用戶類(lèi)型和用戶名傳到MDI窗體中的mnUserType,msUserName中WithfrmMain.mnUserType=mnUserType.msUserName=userEndWithLoadfrmMainfrmMain.ShowUnloadMeEndIfEndSubPrivateSubForm_Load()optUserType(0).Value=TrueEndSubPrivateSuboptUserType_Click(IndexAsInteger)mnUserType=IndexEndSubOptionExplicitPrivateSubCommand1_Click()DimstrCon1AsStringDimstrCon2AsStringOnErrorGoTomyerrIfTrim(Text1.Text)=""OrTrim(Text2.Text)=""ThenIfMsgBox("請(qǐng)輸入查詢條件!",vbInformation,"提示")ThenGoTomyerrEndIfSelectCaseTrim(Combo1.Text)Case"學(xué)號(hào)"strCon1="Serial"Case"姓名"strCon1="Name"Case"班級(jí)"strCon1="Class"Case"生日"strCon1="Birthday"Case"性別"strCon1="Sex"Case"家庭地址"strCon1="Address"Case"電話"strCon1="Tel"EndSelectSelectCaseTrim(Combo4.Text)Case"學(xué)號(hào)"strCon2="Serial"Case"姓名"strCon2="Name"Case"班級(jí)"strCon2="Class"Case"生日"strCon2="Birthday"Case"性別"strCon2="Sex"Case"家庭地址"strCon1="Address"Case"電話"strCon2="Tel"EndSelectDataEnv.rsStudent.CloseDataEnv.rsStudent.Open"select*from學(xué)生信息表where"&_strCon1&Trim(Combo2.Text)&"'"&Trim(Text1.Text)_&"'"&""&Trim(Combo3.Text)&""&strCon2&_Trim(Combo5.Text)&"'"&Trim(Text2.Text)&"'"dgdCX.DataMember=""dgdCX.RefreshDataEnv.rsStudent.RequerydgdCX.DataMember="Student"dgdCX.Refreshmyerr:EndSubPrivateSubCommand3_Click()UnloadMeEndSubPrivateSubdgdCX_Click()EndSubPrivateSubForm_Load()'添加Combo1的子項(xiàng)作為查詢標(biāo)準(zhǔn)Combo1.AddItem("學(xué)號(hào)")Combo1.AddItem("姓名")Combo1.AddItem("班級(jí)")Combo1.AddItem("生日")Combo1.AddItem("性別")Combo1.AddItem("家庭地址")Combo1.AddItem("電話")Combo1.ListIndex=0'添加Combo2的子項(xiàng)作為關(guān)系符Combo2.AddItem("=")Combo2.AddItem(">")Combo2.AddItem(">=")Combo2.AddItem("<")Combo2.AddItem("<=")Combo2.AddItem("<>")Combo2.ListIndex=0'添加Combo3的子項(xiàng)作為邏輯連接符Combo3.AddItem("And")Combo3.AddItem("Or")Combo3.ListIndex=0'添加Combo4的子項(xiàng)作為第二種查詢標(biāo)準(zhǔn)Combo4.AddItem("學(xué)號(hào)")Combo4.AddItem("姓名")Combo4.AddItem("班級(jí)")Combo4.AddItem("生日")Combo4.AddItem("性別")Combo4.AddItem("家庭地址")Combo4.AddItem("電話")Combo4.ListIndex=0'添加Combo5的子項(xiàng)作為第二種關(guān)系符Combo5.AddItem("=")Combo5.AddItem(">")Combo5.AddItem(">=")Combo5.AddItem("<")Combo5.AddItem("<=")Combo5.AddItem("<>")Combo5.ListIndex=0EndSubPrivateSubForm_Unload(CancelAsInteger)frmMain.Enabled=TruefrmMain.ShowEndSub附錄資料:不需要的可以自行刪除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提供了幾種不同類(lèi)型的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)某種類(lèi)型的消息發(fā)生時(shí),WINDOWS向此種類(lèi)型的HOOK鏈的第一個(gè)函數(shù)發(fā)送該消息,在第一函數(shù)處理完該消息后由該函數(shù)向鏈表中的下一個(gè)函數(shù)傳遞消息,依次向下。如果鏈中某個(gè)函數(shù)沒(méi)有向下傳送該消息,那么鏈表中后面的函數(shù)將得不到此消息。(對(duì)于某些類(lèi)型的HOOK,不管HOOK鏈中的函數(shù)是否向下傳遞消息,與此類(lèi)型HOOK聯(lián)系的所有HOOK函數(shù)都會(huì)收到系統(tǒng)發(fā)送的消息)
HOOK過(guò)程
為了攔截特定的消息,你可以使用SetWindowsHookEx函數(shù)在該類(lèi)型的HOOK鏈中安裝你自己的HOOK函數(shù)。該函數(shù)語(yǔ)法如下:
publicfunctionMyHook(nCode,wParam,iParam)aslong
‘加入代碼
endfunction
其中MyHook可以隨便命名,其它不能變。該函數(shù)必須放在模塊段。nCode指定HOOK類(lèi)型。wParam,iParam的取值隨nCode不同而不同,它代表了某種類(lèi)型的HOOK的某個(gè)特定的動(dòng)作。
SetWindowsHookEx總是將你的HOOK函數(shù)放置在HOOK鏈的頂端。你可以使用CallNextHookEx函數(shù)將系統(tǒng)消息傳遞給HOOK鏈中的下一個(gè)函數(shù)。
[注釋]對(duì)于某些類(lèi)型的HOOK,系統(tǒng)將向該類(lèi)的所有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ì)同其它使用該類(lèi)HOOK的應(yīng)用程序產(chǎn)生沖突。
HOOK類(lèi)型
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)或鍵盤(pán)事件前;在設(shè)置輸入焦點(diǎn)前,或同步系統(tǒng)消息隊(duì)列前,將調(diào)用WH_CBTHOOK。你可以在你的HOOK過(guò)程攔截該類(lèi)HOOK,并返回一個(gè)值,告訴系統(tǒng),是否繼續(xù)執(zhí)行上面的操作。
WH_DEBUGHOOK
系統(tǒng)在調(diào)用與某種HOOK類(lèi)型聯(lián)系的HOOK過(guò)程前,將調(diào)用WH_DEBUG,應(yīng)用程序可以使用該HOOK決定是否讓系統(tǒng)執(zhí)行某種類(lèi)型的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)、鍵盤(pán)輸入和發(fā)送到隊(duì)列中的其它消息。
WH_JOURNALRECORDHook
WH_JOURNALRECORDHook使應(yīng)用程序可以監(jiān)視輸入事件。典型地,應(yīng)用程序使用該HOOK記錄鼠標(biāo)、鍵盤(pán)輸入事件以供以后回放。該HOOK是全局HOOK,并且不能在指定線程中使用。
WH_JOURNALPLAYBACKHook
`WH_JOURNALPLAYBACKHook使應(yīng)用程序可以向系統(tǒng)消息隊(duì)列中插入消息。該HOOK可以回放以前由WH_JOURNALRECORDHOOK錄制的鼠標(biāo)、鍵盤(pán)輸入事件。在WH_JOURNALPLAYBACKHook安裝到系統(tǒng)時(shí),鼠標(biāo)、鍵盤(pán)輸入事件將被屏蔽。該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ì)列中的鍵盤(pán)輸入。
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
安裝、銷(xiāo)毀HOOK過(guò)程
監(jiān)視系統(tǒng)事件安裝、銷(xiāo)毀HOOK過(guò)程
使用SetWindowsHookEx函數(shù),指定一個(gè)HOOK類(lèi)型,自己的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的種類(lèi)和nCode的值之不同而不同。
因這個(gè)叁數(shù)是一個(gè)Function的Address所以我們固定將HookFunction放在.Bas中,并以AddressOfHookFunc傳入。至於HookFunction的名稱(chēng)我們可以任意給定,不一定叫HookFunchmod代表.DLL的hInstance,如果是LocalHook,該值可以是Null(VB中可傳0進(jìn)去),而如果是RemoteHook,則可以使用GetModuleHandle(".dll名稱(chēng)")來(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
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030全球核電站管道系統(tǒng)行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球環(huán)氧干式變壓器行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國(guó)超聲軟組織手術(shù)刀行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025年全球及中國(guó)家具彈性帶行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025倉(cāng)庫(kù)租賃合同簡(jiǎn)單范本(合同版本)
- 2025年外研銜接版選修4歷史上冊(cè)月考試卷含答案
- 掌握職業(yè)規(guī)劃與就業(yè)技巧主題班會(huì)
- 三通一平合同規(guī)定年
- 土地承包合同范本內(nèi)容
- 個(gè)人門(mén)面房租賃簡(jiǎn)單的合同
- 2024年湖南高速鐵路職業(yè)技術(shù)學(xué)院高職單招數(shù)學(xué)歷年參考題庫(kù)含答案解析
- 上海鐵路局招聘筆試沖刺題2025
- 國(guó)旗班指揮刀訓(xùn)練動(dòng)作要領(lǐng)
- 春季安全開(kāi)學(xué)第一課
- 植物芳香油的提取 植物有效成分的提取教學(xué)課件
- 肖像繪畫(huà)市場(chǎng)發(fā)展現(xiàn)狀調(diào)查及供需格局分析預(yù)測(cè)報(bào)告
- 2021-2022學(xué)年遼寧省重點(diǎn)高中協(xié)作校高一上學(xué)期期末語(yǔ)文試題
- 同等學(xué)力英語(yǔ)申碩考試詞匯(第六版大綱)電子版
- 墓地個(gè)人協(xié)議合同模板
- 2024年部編版初中語(yǔ)文各年級(jí)教師用書(shū)七年級(jí)(上冊(cè))
- 中日合同范本
評(píng)論
0/150
提交評(píng)論