国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

在關機或Logff前信息的攔截

2019-11-18 17:51:38
字體:
來源:轉載
供稿:網友
如果我們關機或Logoff時,我們的程序有時會因而無法按正常程序結束,一般我們會在Form的Unload中一段程序結束時要做什么事,但是,如果使用者直接用開始功能菜單的關機,會使UnLoad的部份沒有做到,我們現在就想辦法來攔截關機(或Logoff)時的信息。

一般來說,關機或Logff后,Windows會傳依序送出WM_QUERYENDsession的信息給每個PRocess,如果中間有一個Process不能順利結束(例如:Word修改后未存檔,而出現是否存檔,但我們按取消),這時該信息執行的結果會傳回False(0),這時Windows也就不再繼續送WM_QUERYENDSESSION給下一個Proccess。反之,如果所有的Process都可以順利結束(也就是每個送出的WM_QUERYENDSESSION都傳回True),那才代表以以順利結束。

不管WM_QUERYENDSESSION最后的結果是可以順利結束或不能順利結束,Windows會再送一個WM_ENDSESSION的信息給所有的Process,而wParam的內容便是指出是否可以順利結束(True菜單可以,False菜單不行,在vb中則CheckwParam=0菜單False,0菜單True),說到這里大概就知道該如何做啦,程序如下:

'以下在Form
PrivateSubForm_Load()
DimretAsLong
'記錄原來的WindowProcedure的位址
preWinProc=GetWindowLong(Me.hwnd,GWL_WNDPROC)
'設定form的windowProcedure到wndproc
ret=SetWindowLong(Me.hwnd,GWL_WNDPROC,AddressOfwndproc)
EndSub

PrivateSubForm_Unload(CancelAsInteger)
DimretAsLong
'取消Message的截取,而使之又只送往原來的WindowProcedure
ret=SetWindowLong(Me.hwnd,GWL_WNDPROC,preWinProc)
'這里只是要看看用關機的方式結束程序時,會不會執行到這里
DimfnoAsLong
fno=FreeFile
Open"c:/tt2"ForAppendAsfno
Print#fno,"ccc" vbCrLf
Close#fno
EndSub

'以下在.Bas

OptionExplicit

DeclareFunctionSetWindowLongLib"user32"Alias"SetWindowLongA"_
(ByValhwndAsLong,ByValnIndexAsLong,ByValdwNewLongAsLong)AsLong
DeclareFunctionGetWindowLongLib"user32"Alias"GetWindowLongA"_
(ByValhwndAsLong,ByValnIndexAsLong)AsLong
DeclareFunctionCallWindowProcLib"user32"Alias"CallWindowProcA"_
(ByVallpPrevWndFuncAsLong,ByValhwndAsLong,ByValMsgAsLong,_
ByValwParamAsLong,ByVallParamAsLong)AsLong

PublicConstGWL_WNDPROC=(-4)
PublicConstWM_ENDSESSION=&H16
PublicConstWM_QUERYENDSESSION=&H11

PublicpreWinProcAsLong

PublicFunctionwndproc(ByValhwndAsLong,ByValMsgAsLong,_
ByValwParamAsLong,ByVallParamAsLong)AsLong
IfMsg=WM_QUERYENDSESSIONThen
Debug.Print"QryEnd",wParam,lParam
Else
IfMsg=WM_ENDSESSIONThen
IfwParam0Then'代表將順利關機或LogOff,這時便得做正常結束程序的操作
DimfnoAsLong
Open"c:/ttt"ForOutputAs#1
Print#1,"hahcccc5"
Close#1
EndIf
EndIf
EndIf
'將之送往原來的WindowProcedure
wndproc=CallWindowProc(preWinProc,hwnd,Msg,wParam,lParam)
EndFunction

->


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黔西县| 温泉县| 抚顺县| 民权县| 和田市| 阿拉善左旗| 贵港市| 龙南县| 新竹县| 恭城| 隆尧县| 镇平县| 尚义县| 阿巴嘎旗| 巴彦县| 全南县| 吉林省| 玉溪市| 日照市| 浮山县| 潼南县| 津南区| 平邑县| 建始县| 隆子县| 邵阳市| 兴宁市| 青田县| 沅江市| 永兴县| 建宁县| 渭南市| 宣汉县| 石门县| 营口市| 金寨县| 嘉禾县| 南阳市| 建德市| 来安县| 昌吉市|