吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9425|回复: 50
收起左侧

[原创工具] 可以获取当前所有进程的命令行及参数

  [复制链接]
goldli 发表于 2019-3-19 11:34
本帖最后由 goldli 于 2019-3-20 08:59 编辑

如题。 使用 C# + WMI + WPF 完成。 速度快。可以直接点击拷贝文字。 缺点,后台使用了3个线程,大约会占17%~30% 的CPU

需要安装 .net framework 4.52来运行

68324-20190318135524263-1236955579.png

文件下载   WinAppCmdLineMonitor.rar (9.2 KB, 下载次数: 163)


核心代码如下:

[C#] 纯文本查看 复制代码
internal sealed class ProcessMonitor
    {

        private readonly ConcurrentDictionary<string, ProcessInfo> _processes;
        private readonly ConcurrentQueue<ProcessInfo> _listQueue;

        public ProcessMonitor()
        {
            _processes = new ConcurrentDictionary<string, ProcessInfo>();
            _listQueue = new ConcurrentQueue<ProcessInfo>();
        }

        public void Start(CancellationToken token)
        {
            StartMonitor(token);
            Parse(token);
            ProcessDestroyMonitor(token);
        }

        /// <summary>
        /// 使用wmi获取当前进程快照
        /// </summary>
        /// <param name="fields">选取的字段</param>
        /// <returns></returns>
        private ManagementObjectCollection getCurrentProcess(string fields = "*")
        {
            using (var searcher = new ManagementObjectSearcher($"SELECT {fields} FROM Win32_Process"))
            {
                return searcher.Get();
            }
        }

        /// <summary>
        /// 开始监控
        /// </summary>
        /// <param name="token"></param>
        private void StartMonitor(CancellationToken token)
        {
            Task.Factory.StartNew(() =>
            {
                while (!token.IsCancellationRequested)
                {
                    foreach (var o in getCurrentProcess())
                    {
                        var w = new ProcessInfo(o);

                        if (!_processes.ContainsKey(w.Key))
                        {
                            _processes[w.Key] = w;
                            _listQueue.Enqueue(w);
                        }
                        Thread.Sleep(1);
                    }

                    Thread.Sleep(10);
                }
            },token);
        }

        /// <summary>
        /// 开始解析监控的结果
        /// </summary>
        /// <param name="token"></param>
        private void Parse(CancellationToken token)
        {
            Task.Factory.StartNew(() =>
            {
                while (!token.IsCancellationRequested)
                {
                    if (!_listQueue.IsEmpty)
                    {
                        if (_listQueue.TryDequeue(out var p))
                        {
                            OnAsyncGotProcess?.BeginInvoke(p,null,null);
                        }
                    }
                    Thread.Sleep(10);
                };
            }, token);
        }

        /// <summary>
        /// 判断指定的进行是否还在运行
        /// </summary>
        /// <param name="pi"></param>
        /// <param name="list"></param>
        /// <returns></returns>
        private bool IsProcessExists(ProcessInfo pi, ManagementObjectCollection list)
        {
            foreach (var p in list)
            {
                if (pi.IsSameWith(p))
                {
                    return true;
                }
            }

            return false;
        }

        /// <summary>
        /// 对当前进程快照进行分析,与原有的快照进行对比。以判断是否有进程已经销毁
        /// </summary>
        /// <param name="token"></param>
        private void ProcessDestroyMonitor(CancellationToken token)
        {
            Task.Factory.StartNew(() =>
            {
                while (!token.IsCancellationRequested)
                {
                    if (!_processes.IsEmpty)
                    {
                        var list = getCurrentProcess(" ProcessId ,Name ");
                        var storedList = _processes.Values;
                        foreach (var p1 in storedList)
                        {
                            if (IsProcessExists(p1, list))
                            {
                                continue;
                            }
                            _processes.TryRemove(p1.Key, out _);
                            Thread.Sleep(1);
                        }
                    }
                    Thread.Sleep(200);
                };
            }, token);
        }

        public event Action<ProcessInfo> OnAsyncGotProcess;
    }








免费评分

参与人数 7吾爱币 +12 热心值 +7 收起 理由
我还没长大 + 1 + 1 支持,从来没用过这么好用的东西
msold5 + 1 + 1 好用,必须赞一个
weiwei321 + 1 + 1 我很赞同!
xyieou + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
mefcl + 1 + 1 来个中文就更好了,虽然那几个单词很简单
云在天 + 6 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wk4funny + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| goldli 发表于 2019-3-25 12:35
Kanye 发表于 2019-3-25 10:46
这个比任务管理器的更详细?

不会。这个只是取出命令行参数,然后可以把命令行拷贝出来
liu116114 发表于 2019-3-19 11:39
Dolts 发表于 2019-3-19 11:42
tornado 发表于 2019-3-19 11:45
辅助做个视野
seven11223 发表于 2019-3-19 11:47
辅助插眼做好视野
lihaisanhui 发表于 2019-3-19 11:49
感谢分享了
第八个男人 发表于 2019-3-19 11:51
喔唷,不错,3线程可以忽略。
小和00 发表于 2019-3-19 11:54
占个坑 圈个地!
 楼主| goldli 发表于 2019-3-19 12:00
多谢捧场。
erazul 发表于 2019-3-19 13:01
复制不了耶
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-29 09:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表