Najpierw procesy:
void AddProcess(HWND lv)
{
LVITEM item;
PROCESSENTRY32 entry;
int idx = 0;
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
item.mask = LVIF_TEXT;
item.iItem = idx;
item.iSubItem = 0;
item.pszText = (char*)LocalAlloc(0, MAX_PATH);
entry.dwSize = sizeof(entry);
if (Process32First(snapshot, &entry))
{
wsprintf(item.pszText, "%X", entry.th32ProcessID);
ListView_InsertItem(lv, &item);
ListView_SetItemText(lv, idx, 1, entry.szExeFile);
idx++;
}
entry.dwSize = sizeof(entry);
while (Process32Next(snapshot, &entry))
{
item.iItem = idx;
wsprintf(item.pszText, "%X", entry.th32ProcessID);
ListView_InsertItem(lv, &item);
ListView_SetItemText(lv, idx, 1, entry.szExeFile);
idx++;
entry.dwSize = sizeof(entry);
}
LocalFree(item.pszText);
CloseHandle(snapshot);
}
Funkcja jako parametr przyjmuje handle kontrolki ListView i wypelnia ja procesami (PID i nazwa pliku).
W MSDN'ie pod ktoras z funkcji Process32* widzialem jeszcze prostszy przyklad.
A teraz mutexy:
HANDLE mutex = CreateMutex(NULL, TRUE, "jakis_unikalny_string");
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
if(mutex)
CloseHandle(mutex);
return 0;
}
// program glowny...
ReleaseMutex(mutex);
CloseHandle(mutex);