Richard,
I use this code for testing "sleep" program process.
Regards
Pawel
#define MAX_TASKS 256
#define PROCESS_SIZE 128
#define TITLE_SIZE 64
typedef struct _TASK_LIST
{
DWORD cntUsage;
DWORD dwProcessId;
DWORD dwInheritedFromProcessId;
DWORD cntThreads;
DWORD th32ModuleID;
DWORD th32DefaultHeapID;
LONG pcPriClassBase;
BOOL flags;
HWND hwnd;
TCHAR ProcessName[PROCESS_SIZE];
TCHAR WindowTitle[TITLE_SIZE];
}
TASK_LIST, *PTASK_LIST;
DWORD GetTaskListCE (PTASK_LIST pTask, DWORD dwNumTasks);
BOOL KillProcess (PTASK_LIST tlist, BOOL fForce = TRUE);
HB_FUNC (APPTASK)
{
DWORD i = 0, j = 0, k = 0;
TASK_LIST tlist[MAX_TASKS];
DWORD numTasks;
BOOL bCurrent = ISNIL (1) ? TRUE : hb_parl (1);
BOOL bRet = FALSE;
k = GetCurrentProcessId ();
memset (&tlist, 0, sizeof (TASK_LIST) * MAX_TASKS);
numTasks = GetTaskListCE (tlist, MAX_TASKS);
for (i = 0; i < numTasks; i ++)
{
if (bCurrent || k != tlist[i].dwProcessId && _tcscmp (_tcsupr (tlist[i].ProcessName), TEXT ("APPNAME.EXE")) == 0)
{
KillProcess (&tlist[i], TRUE);
bRet = TRUE;
}
}
hb_retl (bRet);
}
DWORD GetTaskListCE (PTASK_LIST pTask, DWORD dwNumTasks)
{
HINSTANCE hProcessSnap = NULL;
PROCESSENTRY32 pe32 = {0};
DWORD dwTaskCount = 0;
if (dwNumTasks == 0) return 0;
hProcessSnap = (HINSTANCE) CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == (HANDLE) -1) return 0;
dwTaskCount = 0;
pe32.dwSize = sizeof (PROCESSENTRY32);
if (Process32First (hProcessSnap, &pe32))
{
do
{
LPTSTR pCurChar;
if (_tcsstr (pe32.szExeFile, L"\\"))
pCurChar = _tcsrchr (pe32.szExeFile, '\\');
else
pCurChar = pe32.szExeFile;
lstrcpy (pTask->ProcessName, pCurChar);
pTask->flags = 0;
pTask->dwProcessId = pe32.th32ProcessID;
pTask->cntThreads = pe32.cntThreads;
pTask->cntUsage = pe32.cntUsage;
pTask->dwInheritedFromProcessId = pe32.th32ParentProcessID;
pTask->th32ModuleID = pe32.th32ModuleID;
++ dwTaskCount;
++ pTask;
}
while (dwTaskCount < dwNumTasks && Process32Next (hProcessSnap, &pe32));
}
else dwTaskCount = 0;
CloseHandle (hProcessSnap);
CloseToolhelp32Snapshot (hProcessSnap);
return dwTaskCount;
}
BOOL KillProcess (PTASK_LIST tlist, BOOL fForce)
{
HANDLE hProcess;
if (fForce || !tlist->hwnd)
{
hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, tlist->dwProcessId);
if (hProcess)
{
hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, tlist->dwProcessId);
if (hProcess == NULL)
{
return FALSE;
}
if (!TerminateProcess (hProcess, 1))
{
CloseHandle (hProcess);
return FALSE;
}
CloseHandle (hProcess);
return TRUE;
}
}
PostMessage (tlist->hwnd, WM_CLOSE, 0, 0);
return TRUE;
}