Принимая снимок должен работать нормально, но вы должны использовать флаг, чтобы избежать ограничений памяти бросать исключение:
[Flags]
private enum SnapshotFlags : uint
{
HeapList = 0x00000001,
Process = 0x00000002,
Thread = 0x00000004,
Module = 0x00000008,
Module32 = 0x00000010,
Inherit = 0x80000000,
All = 0x0000001F,
NoHeaps = 0x40000000
}
Затем в обычном вызове CreateToolhelp32Snapshot вы можете получить список процессов:
public static Dictionary<UInt32, process> getProcessNameList()
{
int iCnt = 0;
//List<processnames> name_list = new List<processnames>();
Dictionary<UInt32, process> _pList = new Dictionary<uint, process>();
uint procID = 0;
IntPtr pHandle = CreateToolhelp32Snapshot(SnapshotFlags.Process | SnapshotFlags.NoHeaps, procID);
if ((Int32)pHandle == INVALID_HANDLE_VALUE)
throw new Exception("CreateToolhelp32Snapshot error: " + Marshal.GetLastWin32Error().ToString());
if ((int)pHandle != INVALID_HANDLE_VALUE)
{
PROCESSENTRY32 pEntry = new PROCESSENTRY32();
pEntry.dwSize = (uint)Marshal.SizeOf(pEntry);
if (Process32First(pHandle, ref pEntry) == 1)
{
do
{
//name_list.Add(new processnames(pEntry.th32ProcessID, pEntry.szExeFile));
_pList[pEntry.th32ProcessID] = new process(pEntry.th32ProcessID, pEntry.szExeFile, new List<thread>());
iCnt++;
} while (Process32Next(pHandle, ref pEntry) == 1);
}
else
System.Diagnostics.Debug.WriteLine("Process32First error: " + Marshal.GetLastWin32Error().ToString());
CloseToolhelp32Snapshot(pHandle);
}
return _pList;
}
Приведенный выше код является частью моего удаленного ProcessorUsage test application.
Тем не менее, обычное мобильное приложение Windows прекратит их, если предыдущий экземпляр уже запущен. Это также является значением по умолчанию при создании и запуске проекта SmartDevice в настройке CSharp или CPP «Windows Mobile ...». Если вы настроили таргетинг на стандартный SDK на базе стандартного Windows CE, то нет автоматического кода, созданного для предотвращения появления нескольких экземпляров в стартовом коде приложения.
Сообщите нам, если вам по-прежнему нужна помощь.
Спасибо. Флаг NoHeap был именно тем, что мне нужно. Замечание: хотя по большей части, когда я выполняю process.start, будет запущен только один экземпляр. Я обнаружил, что если вы правильно назовете свои звонки, вы можете запустить несколько экземпляров программы. – GH23
Да, флаг noHeap необходим с WM5/CE5. Сроки не должны запускать приложение с несколькими экземплярами. Приложение может проверяться при начале, если оно уже запущено, а затем переключиться на предыдущий экземпляр и завершить работу. – josef
Тогда я не знаю, как это происходит, но почему-то несколько экземпляров одного из моих приложений запускаются. Большую часть времени я вижу только один экземпляр, но иногда я видел два или три экземпляра. Во всяком случае, еще раз спасибо за помощь, с которой он работал, как шарм. – GH23