FORCAR FINALIZACAO DE EXECUTAVEL

POCCI 15/09/2005 19:23:11
#104486
Galera, veja so a situação... existe a possibilidade de se mandar um aviso a todos os usuarios logados no sistema,tipo um msgbox a cada 10 segudos num periodo de 1 minuto, avisando que o sistema será atualizado e que ele precisa fechar o sistema.

Se neste 1 minuto o usuario não fechar, automaticamente o EXE se encerra ...

Talvez parece meio complexo, mas penso que vou ter que guardar em algum lugar os usuários que estão logados e tb um usar um timer no menu principal pra ficar checando se tem algum aviso....

Bom, se alguem tiver alguma dica, agradeço a atenção...

Abraços a todos.
USUARIO.EXCLUIDOS 15/09/2005 21:27:04
#104504
Cole isso no form:


Option Explicit

Private Declare Function IsWindow Lib "user32" (ByVal Hwnd As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal Hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal Hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal Hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Const GW_OWNER = 4
Private Const GWL_STYLE = (-16)
Private Const WS_DISABLED = &H8000000
Private Const WM_CANCELMODE = &H1F
Private Const WM_CLOSE = &H10

Function EndTask(TargetHwnd As Long) As Long
Dim Tmp1 As Long

If TargetHwnd = Hwnd Or GetWindow(TargetHwnd, GW_OWNER) = Hwnd Then
End
End If

If IsWindow(TargetHwnd) = False Then GoTo EndTaskFail
If (GetWindowLong(TargetHwnd, GWL_STYLE) And WS_DISABLED) Then GoTo EndTaskSucceed

If IsWindow(TargetHwnd) Then
If Not (GetWindowLong(TargetHwnd, GWL_STYLE) And WS_DISABLED) Then
PostMessage TargetHwnd, WM_CANCELMODE, 0&, 0&
PostMessage TargetHwnd, WM_CLOSE, 0&, 0&
DoEvents
End If
End If

GoTo EndTaskSucceed

EndTaskFail:
Tmp1 = False
GoTo EndTaskEndSub
EndTaskSucceed:
Tmp1 = True
EndTaskEndSub:
EndTask = Tmp1
End Function


Private Sub Command1_Click()
Dim Tmp1 As Long
Dim Tmp2 As Long

Tmp1 = FindWindow(vbNullString, "Calculadora") 'procura uma janela com o titulo Calculadora

If Tmp1 = 0 Then 'Ele não achou a calculadora
MsgBox "A Calculadora não está aberta!"
Exit Sub
End If

Tmp2 = EndTask(Tmp1) ' A calculadora foi encontrada
If Tmp2 <> 0 Then
MsgBox "A Calculadora foi fechada!"
Else
MsgBox "Não foi possível fechar a Calculadora!", vbCritical, "Erro"
End If
End Sub


Private Sub Command2_Click()
Dim Tmp1 As Long

Tmp1 = FindWindow(vbNullString, "Calculadora")

If Tmp1 > 0 Then
MsgBox "A Calculadora já está aberta!", vbInformation, "Calculadora"
AppActivate "Calculadora"
Else
Shell "Calc.exe", vbNormalFocus
End If
End Sub
USUARIO.EXCLUIDOS 15/09/2005 21:27:39
#104505
O código foi retirado de:
http://www.vbmania.com.br/vbmdetail.php?varID=3541&TxtSearch=fechar&CmbSort=ftitulo&varPagina=1
USUARIO.EXCLUIDOS 16/09/2005 12:39:07
#104608
Resposta escolhida
Cara, faça o seguinte....
Bem simples e bem funcional...

no mdi coloque um timer.
crie uma tabela no BD e set um valor para ela no bd...
no timer verifique o valor deste campo.. ( crie uma procedure pra agilizar o eskema )
se o campo for igual a 0, nao faz nda....
dai se vc setar o campo como 1 e o timer verificar..vc começa a disparar as mensagens...
faça um contador, para determinar a quantidade de vezes que será ativado...
quando chegar na qtde de vezes determinadaÂÂÂ'por você...vc da um
unload mdiform1.

pronto...

no meu sistema aqui, eu uso mais ou menos isso...
ai brincando um pouco vc vai deixando ele muito mais complexo...
como por exemplo..nao utilizar essa msgbox que vc falow...
e sim, akele tela ( estilo do msn ) avisando que falta determinado tempo para o programa se auto fechar...

qq duvida;;
tamu ai na atividade
USUARIO.EXCLUIDOS 16/09/2005 13:16:48
#104620
Para forçar o programa a fechar mesmo faça o seguinte:

Private Declare Sub PostQuitMessage Lib "user32" Alias "PostQuitMessage" (ByVal nExitCode As Long)


Depois na função que vai executar o fechamento coloque a seguinte linha, para encerrar imediatamente:

PostQuitMessage(0)
Tópico encerrado , respostas não são mais permitidas