EVITAR O DESLIGAMENTO DO WINDOWS

PEGUDO 23/06/2010 13:53:03
#345589
Alguém sabe de uma maneira de evitar que o windows seja desligado sem que um certo aplicativo seja encerrado?
JAMESBOND007 23/06/2010 14:26:14
#345593
no vb eu faria assim
Private Sub Command1_Click()
Shell ([Ô]Shutdown -a[Ô])
End Sub


Esse comando shell e pra executar comandos do prompt-dos shutdown -a (Evita o desligamento)
FFCOUTO 23/06/2010 17:41:11
#345609
Resposta escolhida
Adicione um módulo ao seu projeto e copie o código abaixo:

Option Explicit

Public Const GWL_WNDPROC = (-4)
Public Const WM_ENDSESSION = &H16
Public Const WM_QUERYENDSESSION = &H11
Public WndProc As Long

Private 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
Private Declare Function SetWindowLong Lib [Ô]user32[Ô] Alias [Ô]SetWindowLongA[Ô] (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

[ô] exiting from windows
[ô]-------------------------------------------------------
[ô]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
Public Declare Function ExitWindowsEx Lib [Ô]user32.dll[Ô] (ByVal uFlags As Long, ByVal dwReserved As Long) As Long

[ô]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
[ô]MsgBox [Ô]hw:[Ô] + CStr(hw) + [Ô] uMsg:[Ô] + CStr(uMsg) + [Ô] wParam:[Ô] + CStr(wParam)
WindowProc = False [ô]send don[ô]t shut down
[ô]run code do what you want, then call ExitWindowsEx etc up to you
Exit Function
ElseIf uMsg = WM_ENDSESSION Then
[ô]MsgBox [Ô]hw:[Ô] + CStr(hw) + [Ô] uMsg:[Ô] + CStr(uMsg) + [Ô] wParam:[Ô] + CStr(wParam)
WindowProc = False
[ô]run code
Exit Function
End If

WindowProc = CallWindowProc(WndProc, hw, uMsg, wParam, lParam)
End Function


No Form principal do seu programa acrescente o código abaixo no Load do Form:

Private Sub Form_Load()
Hook Me.hWnd

[ô]Seus comandos
End Sub


Dessa form o Windows só será desligado após o encerramento do seu programa.
PEGUDO 24/06/2010 06:57:08
#345641
JAMESBOND007 seu código funcionou direitinho, mas ele deixava uma latência (atraso) no windows (pelo menos aqui no windows7), por isso eu utilizei o do FFCOUTO porque, se tratando de API, a resposta do código foi imediata e não permite ao usuário executar nenhuma tarefa sem antes colocar o horário de saída.

Obrigado a todos.
Tópico encerrado , respostas não são mais permitidas