VERIFICAR EXECUCAO DE UM PROGRAMA

USUARIO.EXCLUIDOS 04/04/2007 09:43:49
#210318
Bom dia, gostaria de saber como verifico se um determinado programa esta em execucao no sistema. Pesquisei no forum, mas infelizmente nao localizei nada parecido.

Meu problema eh que preciso verificar a execucao de um programa (.EXE) para decidir se fecho ou executo-o, caso nao esteja em execucao.

Agradeco quaquer ajuda.
USUARIO.EXCLUIDOS 04/04/2007 09:45:54
#210319
Eu, nao entendi direito a pergunta, porem voce ja tentou Ctrl+alt+delete???
USUARIO.EXCLUIDOS 04/04/2007 10:06:23
#210321
Nao, eu preciso saber se um programa está em execução através do VB. Se fosse só CTRL+ALT+DEL meu problema eu tinha postado num fórum de windows aí pela vida né? [S23]
USUARIO.EXCLUIDOS 04/04/2007 11:47:52
#210349
credo, nao vou nem entrar em detalhes aqui

fuiiiiiiiiii

JPC666 04/04/2007 11:59:40
#210351
nossa...
Pesquise sobre processos. No .Net tem o System.Diagnostics.process (algo assim)...
Vou ver se acho alguma coisa sobre processos em VB 6 e posto.

abraaaaaaaaaaaço
USUARIO.EXCLUIDOS 04/04/2007 12:08:56
#210352
Resposta escolhida
faz assim:

no form:

crie um textbox e um commandbutton

Citação:

Private Sub Command1_Click()
Dim uLngProcess As Long
uLngProcess = GetProcessIDByEXEName(Me.Text1.Text)
If uLngProcess = 0 Then
MsgBox ("Esse processo não está em execução !!"), vbCritical
Else
If MsgBox("Esse processo está em execução, deseja encerrá-lo ?", vbQuestion + vbYesNo) = vbYes Then
If uLngProcess <> 0 Then ProcessTerminate uLngProcess
Else
MsgBox ("Processo em execução e não terminado !!"), vbInformation
End If
End If
End Sub



Num módulo:


Citação:

Global Const MAX_PATH = 260
Private Const SE_PRIVILEGE_ENABLED = &H2
Private Const TH32CS_SNAPPROCESS As Long = 2&
Private Const TOKEN_ADJUST_PRIVILEGES = &H20
Private Const TOKEN_QUERY = &H8

Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long

Private Type PROCESSENTRY32: dwSize As Long: cntUsage As Long: th32ProcessID As Long: th32DefaultHeapID As Long: th32ModuleID As Long: cntThreads As Long: th32ParentProcessID As Long: pcPriClassBase As Long: dwFlags As Long: szExeFile As String * MAX_PATH: End Type
Private Type LUID: UsedPart As Long: IgnoredForNowHigh32BitPart As Long: End Type
Private Type TOKEN_PRIVILEGES: PrivilegeCount As Long: TheLuid As LUID: Attributes As Long: End Type


Function GetProcessIDByEXEName(ByVal EXEName As String) As Long

Dim hSnapShot As Long
Dim uProcess As PROCESSENTRY32
Dim R As Long, lStrtemp As String

hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&)

If hSnapShot = -1 Then Exit Function

uProcess.dwSize = Len(uProcess)
R = ProcessFirst(hSnapShot, uProcess)

Do While R

If InStr(UCase(uProcess.szExeFile), UCase(EXEName)) <> 0 Then
GetProcessIDByEXEName = uProcess.th32ProcessID
Call CloseHandle(hSnapShot)
Exit Function
End If

R = ProcessNext(hSnapShot, uProcess)

Loop

Call CloseHandle(hSnapShot)

End Function


Function ProcessTerminate(Optional lProcessID As Long, Optional lHwndWindow As Long) As Boolean
Dim lhwndProcess As Long
Dim lExitCode As Long
Dim lRetVal As Long
Dim lhThisProc As Long
Dim lhTokenHandle As Long
Dim tLuid As LUID
Dim tTokenPriv As TOKEN_PRIVILEGES, tTokenPrivNew As TOKEN_PRIVILEGES
Dim lBufferNeeded As Long

Const PROCESS_ALL_ACCESS = &H1F0FFF, PROCESS_TERMINATE = &H1
Const ANYSIZE_ARRAY = 1, TOKEN_ADJUST_PRIVILEGES = &H20
Const TOKEN_QUERY = &H8, SE_DEBUG_NAME As String = "SeDebugPrivilege"
Const SE_PRIVILEGE_ENABLED = &H2

On Error Resume Next
If lHwndWindow Then
'Get the process ID from the window handle
lRetVal = GetWindowThreadProcessId(lHwndWindow, lProcessID)
End If

If lProcessID Then
'Give Kill permissions to this process
lhThisProc = GetCurrentProcess

OpenProcessToken lhThisProc, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, lhTokenHandle
LookupPrivilegeValue "", SE_DEBUG_NAME, tLuid
'Set the number of privileges to be change
tTokenPriv.PrivilegeCount = 1
tTokenPriv.TheLuid = tLuid
tTokenPriv.Attributes = SE_PRIVILEGE_ENABLED
'Enable the kill privilege in the access token of this process
AdjustTokenPrivileges lhTokenHandle, False, tTokenPriv, Len(tTokenPrivNew), tTokenPrivNew, lBufferNeeded

'Open the process to kill
lhwndProcess = OpenProcess(PROCESS_TERMINATE, 0, lProcessID)

If lhwndProcess Then
'Obtained process handle, kill the process
ProcessTerminate = CBool(TerminateProcess(lhwndProcess, lExitCode))
Call CloseHandle(lhwndProcess)
End If
End If
On Error GoTo 0
End Function


USUARIO.EXCLUIDOS 04/04/2007 17:05:49
#210399
Nicollas, ainda não testei esse procedimento que você postou, mas vou testar daqui a pouco, mas já me adiantando, como eu poderia fazer para ao invés de ocorrer a verificação quando clicasse no botão, ele fizesse de tempos em tempos? Seria utilizando o coponente Timer né? Alguma idéia de como eu poderia substituir o button pelo Timer nesse caso? Ou alguém mais que saiba? Tem tempo que não mexo com Timer, esqueci.

Obrigado desde já.
USUARIO.EXCLUIDOS 04/04/2007 18:09:48
#210410
Citação:

FERTEL escreveu:
Nicollas, ainda não testei esse procedimento que você postou, mas vou testar daqui a pouco, mas já me adiantando, como eu poderia fazer para ao invés de ocorrer a verificação quando clicasse no botão, ele fizesse de tempos em tempos? Seria utilizando o coponente Timer né? Alguma idéia de como eu poderia substituir o button pelo Timer nesse caso? Ou alguém mais que saiba? Tem tempo que não mexo com Timer, esqueci.

Obrigado desde já.



o Timer é a solução!
faz assim crie um label
o mesmo vai receber as horas do Timer

e no evento Change do label coloque a execução do código
sempre que o label trocar os segundos vai executar o código.

USUARIO.EXCLUIDOS 04/04/2007 18:34:04
#210412
Bom pra vc saber se o programa já está aberto (em execução)
use o comando abaixo no local onde vc inicia o sistema em vb.

If App.PrevInstance <> 0 Then
msgbox "Sistema já esta aberto."
end if
USUARIO.EXCLUIDOS 05/04/2007 10:29:33
#210458
Olá,

Para o fonte do Nicolas num timer é só inserir um timer determinar o tempo de execução que é em milisegundos(1000 = 1 segundo). Fica assim

Private Sub Timer1_Timer()
Dim uLngProcess As Long
uLngProcess = GetProcessIDByEXEName(Me.Text1.Text)
If uLngProcess = 0 Then
MsgBox ("Esse processo não está em execução !!"), vbCritical
Else
If MsgBox("Esse processo está em execução, deseja encerrá-lo ?", vbQuestion + vbYesNo) = vbYes Then
If uLngProcess <> 0 Then ProcessTerminate uLngProcess
Else
MsgBox ("Processo em execução e não terminado !!"), vbInformation
End If
End If

End Sub


Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas