博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

枚举CE进程

Posted on 2009-10-12 12:00  脚印  阅读(690)  评论(6编辑  收藏  举报
  [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

希望给需要的朋友有所帮助,少走冤枉路!

 

 



特别提示 感谢李森给出的提示:

还有一点要说明的是,在使用完handle后,要CloseToolhelp32Snapshot(handle);
1[DllImport("toolhelp.dll")]
2[return: MarshalAs(UnmanagedType.Bool)]
3public static extern bool CloseToolhelp32Snapshot(IntPtr hSnapshot);