FORCAR FINALIZACAO DE EXECUTAVEL
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.
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.
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
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
O código foi retirado de:
http://www.vbmania.com.br/vbmdetail.php?varID=3541&TxtSearch=fechar&CmbSort=ftitulo&varPagina=1
http://www.vbmania.com.br/vbmdetail.php?varID=3541&TxtSearch=fechar&CmbSort=ftitulo&varPagina=1
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
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
Para forçar o programa a fechar mesmo faça o seguinte:
Depois na função que vai executar o fechamento coloque a seguinte linha, para encerrar imediatamente:
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