[DllImport("toolhelp.dll")]
private static extern int Process32First(IntPtr hSnapshot, ref PROCESSENTRY32 lppe);
[DllImport("toolhelp.dll")]
private static extern int Process32Next(IntPtr hSnapshot, ref PROCESSENTRY32 lppe);
[DllImport("toolhelp.dll", SetLastError = true)]
private static extern IntPtr CreateToolhelp32Snapshot(uint dwFlags, uint th32ProcessID);
private const uint TH32CS_SNAPPROCESS = 0x00000002;
private const uint TH32CS_SNAPNOHEAPS = 0x40000000;
[StructLayout(LayoutKind.Sequential)]
private struct PROCESSENTRY32
{
public uint dwSize;
public uint cntUsage;
public uint th32ProcessID;
public IntPtr th32DefaultHeapID;
public uint th32ModuleID;
public uint cntThreads;
public uint th32ParentProcessID;
public int pcPriClassBase;
public uint dwFlags;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szExeFile;
}
IntPtr handle = IntPtr.Zero;
try
{
handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS | TH32CS_SNAPNOHEAPS, 0);
PROCESSENTRY32 info = new PROCESSENTRY32();
info.dwSize = (uint)Marshal.SizeOf(typeof(PROCESSENTRY32)) +8;
int first = Process32First(handle, ref info);
//if (first == 0)
// MessageBox.Show("no pr");
//else
{
do
{
//if (string.Compare(info.szExeFile, "CamWedge.exe", true) == 0)
// MessageBox.Show("yes");
listBox1.Items.Add(info.szExeFile);
}
while (Process32Next(handle, ref info) != 0);
}
}
catch
{ throw; }
网上很多这样的文章,但是我按照网上文章去做,在Process32First函数永远返回的都是0,后来才发现原来
info.dwSize = (uint)Marshal.SizeOf(typeof(PROCESSENTRY32)) +8;
这个地方一定要 +8
希望给需要的朋友有所帮助,少走冤枉路!
特别提示 感谢李森给出的提示:
1 | [DllImport( "toolhelp.dll" )] |
2 | [ return : MarshalAs(UnmanagedType.Bool)] |
3 | public static extern bool CloseToolhelp32Snapshot(IntPtr hSnapshot); |