我试图查看有多少应用程序实例在 MC65 设备(Windows Mobile 6.5 设备)上运行。然后,如果有多个应用程序实例正在运行,则杀死所有实例并运行该应用程序。我在这里试过那个代码。但它不适用于 MC65 设备。我相信这是因为它是一个符号设备,我在某处读到它们的行为与非符号设备不同。
有谁知道如何以编程方式找出符号设备上正在运行的进程?
更新:经过进一步测试,设备在创建正在运行的进程的快照时遇到问题。还没有找到解决办法。
我试图查看有多少应用程序实例在 MC65 设备(Windows Mobile 6.5 设备)上运行。然后,如果有多个应用程序实例正在运行,则杀死所有实例并运行该应用程序。我在这里试过那个代码。但它不适用于 MC65 设备。我相信这是因为它是一个符号设备,我在某处读到它们的行为与非符号设备不同。
有谁知道如何以编程方式找出符号设备上正在运行的进程?
更新:经过进一步测试,设备在创建正在运行的进程的快照时遇到问题。还没有找到解决办法。
拍摄快照应该可以正常工作,但您必须使用标志以避免内存限制引发异常:
[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 测试应用程序的一部分。
然而,如果先前的实例已经在运行,普通的 Windows 移动应用程序将自行终止它们。当您在 CSharp 或 CPP 中创建并运行 SmartDevice 项目时,这也是默认设置,目标是“Windows Mobile ...”。如果您以基于标准 Windows CE 的 SDK 为目标,则不会生成自动代码来防止应用程序的启动代码中出现多个实例。
如果您仍需要帮助,请告诉我们。