سلام.
(۱۴-شهریور-۱۳۸۹, ۰۳:۲۹:۰۳)Payman62 نوشته است: [ -> ]سلام.
مطلع شدن از شات دان رو در دات میشه فهمید. میتونی یه dll بسازی و بیاری تو vb6 به کار بگیری.
ولی تؤریت اصلا تؤری خوبی نیست. اومدیمو برق رفت. اومدیمو طرف برنامه رو end task کرد. اومدیمو برنامه ارور داد بسته شد. بعد تکلیف چیه؟
آقا جون چرا لقمه رو دور سرت میچرخونی.
گفتم تو دات نت امکان پذیره. این کدش. به C#.
کد:
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.WindowsShutDown)
MessageBox.Show("Windows is shutting down");
else if (e.CloseReason == CloseReason.TaskManagerClosing)
MessageBox.Show("the program closed by task manager");
}
یه نگاه به ویبی انداختم دیدم خود ویبی هم این قابلیت رو داره. اینم به زبون ویبی.
کد:
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If UnloadMode = vbAppWindows Then
Cancel = True
'run your code here
MsgBox "windows is shutting down"
ElseIf UnloadMode = vbAppTaskManager Then
MsgBox "the program closed by task manager"
End If
End Sub
Cancel = True که هنگام شات دان اجرا میشه یه درخواست به سیستم عامل جهت یه فرصت کوتاه میده. تا برنامه خودش رو جمع جور کنه و بسته شه.
اینم به روشی که مبین جان گفتن.
این کد رو بذار تو یه ماژول.
کد:
Public Const GWL_WNDPROC = (-4)
Public Const WM_ENDSESSION = &H16
Public Const WM_QUERYENDSESSION = &H11
Public WndProc As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
' exiting from windows
'-------------------------------------------------------
Public Declare Function ExitWindowsEx Lib "user32.dll" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
'EWX_FORCE = 4 Force any applications to quit instead of prompting the user to close them.
'EWX_LOGOFF = 0 Log off the network.
'EWX_POWEROFF = 8 Shut down the system and, if possible, turn the computer off.
'EWX_REBOOT = 2 Perform a full reboot of the system.
'EWX_SHUTDOWN = 1
'call this from your form
Public Sub Hook(Lwnd As Long)
Dim uProcess As Long
WndProc = SetWindowLong(Lwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If uMsg = WM_QUERYENDSESSION Then
WindowProc = False
MsgBox "hw:" + CStr(hw) + " uMsg:" + CStr(uMsg) + " wParam:" + CStr(wParam)
'run your code here
Exit Function
ElseIf uMsg = WM_ENDSESSION Then
WindowProc = False
MsgBox "hw:" + CStr(hw) + " uMsg:" + CStr(uMsg) + " wParam:" + CStr(wParam)
'run your code here
Exit Function
End If
WindowProc = CallWindowProc(WndProc, hw, uMsg, wParam, lParam)
End Function
اینم بذار تو فرمت.
کد:
Private Sub Form_Load()
Hook (Me.hwnd)
End Sub
البته من روش اول رو توصیه میکنم. چون هم کوتاه تره هم کدت سبک تر میشه و هم CPU کمتر درگیره.