PROCURAR .EXE NA LISTA DE PROCESSOS!

USUARIO.EXCLUIDOS 28/04/2007 23:53:19
#214233
Salve! Salve!

Procuro uma dica ou um exemplo para saber se determinado programa esta sendo executado na lista de processos.

Pretendo usar a dica no win xp e no win 98se e se possivel no win nt tbem..


obrigado.
CLEVERTON 29/04/2007 13:02:58
#214251

Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Sub Form_Load()
If FindWindow(vbNullString, "Calculadora") = 0 Then MsgBox "Janela Não encontrada"

End Sub
USUARIO.EXCLUIDOS 29/04/2007 23:16:57
#214284
Sim Cleverton você tem razão, interpretei mal a pergunta e nem ao menos analisei seu código. Fui infeliz em tentar indicar uma funcionalidade que não foi solicitada pelo HOCTAEDROM.

No entanto, no exemplo que postei ao remover a linha CloseProcess = TerminateProcess(hProcess, ByVal 0&) > 0 a funcionalidade fica identica ao seu post, e irá servir caso se deseje localizar um processo pelo nome do executável ao invés de pesquisar pelo caption da janela. Veja a seguir:

Option Explicit

Public Const TH32CS_SNAPPROCESS As Long = 2&
Public Const MAX_PATH As Long = 260

Public 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

Public Const PROCESS_ALL_ACCESS As Long = &H1F0FFF

Public Declare Function CreateToolhelp32Snapshot Lib "kernel32" _
(ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Public Declare Function ProcessFirst Lib "kernel32" _
Alias "Process32First" _
(ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Public Declare Function ProcessNext Lib "kernel32" _
Alias "Process32Next" _
(ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Public Declare Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Public Declare Function TerminateProcess Lib "kernel32" _
(ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Public Declare Sub CloseHandle Lib "kernel32" _
(ByVal hPass As Long)

Public Function FindProcess(EXEName As String) As Boolean

Dim hSnapShot As Long
Dim uProcess As PROCESSENTRY32
Dim hProcess As Long

FindProcess = False
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&)
If hSnapShot = -1 Then Exit Function

uProcess.dwSize = Len(uProcess)
If ProcessFirst(hSnapShot, uProcess) = 1 Then
Do
If LCase$(Left$(uProcess.szExeFile, InStr(1, uProcess.szExeFile, vbNullChar) - 1)) = LCase$(EXEName) Then
hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, uProcess.th32ProcessID)
FindProcess = True
Exit Do
End If
Loop While ProcessNext(hSnapShot, uProcess)
End If

Call CloseHandle(hSnapShot)

End Function


Aproveitando parte de seu código tambem é possível deixá-lo com funcionalidade similar ao meu primeiro post, ou seja, encerrar uma aplicação pelo caption de uma janela.

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Const WM_CLOSE = &H10

Public Sub CloseProgram(ByVal Caption As String)
Dim Handle As Long
Handle = FindWindow(vbNullString, Caption)
If Handle = 0 Then Exit Sub
SendMessage Handle, WM_CLOSE, 0&, 0&
End Sub



Sendo assim, agorá tem-se 4 resposta nesse post:
a) localizando um processo pelo caption da janela;
n) encerrando um processo pelo caption de uma janela.
c) localizando um processo pelo nome do executável;
d) encerrando um processo pelo nome do executável;
Tópico encerrado , respostas não são mais permitidas