为您推荐:
精华内容
最热下载
问答
  • 5星
    40KB weixin_51194902 2021-01-08 12:19:19
  • 5星
    35.15MB HowardEmily 2021-01-14 11:50:13
  • 5星
    11.77MB myq19940605 2021-07-23 16:32:12
  • 5星
    5.52MB m0_43393325 2021-05-31 10:48:09
  • 5星
    33.96MB qq_43686414 2021-04-26 15:17:19
  • 5星
    16MB qq_30787727 2021-06-03 22:41:58
  • 5星
    73.72MB weixin_40228600 2021-05-23 13:40:54
  • 5星
    2.22MB weixin_40228600 2021-02-22 10:22:02
  • 5星
    13MB qq_36774586 2021-04-21 10:41:01
  • 5星
    9.92MB tangyang8942 2021-07-04 21:07:05
  • 禁止别人用任务管理器,结束自己的程序进程(.NET程序)。带着这个问题,我开始Google,开始baidu,又开始编程了。和原来的搜索结果一样,什么东西都是一筹莫展,得到的答案永远是:C#没有办法自己去禁止别人用任务...

    转载的,mark一下

    禁止别人用任务管理器,结束自己的程序进程(.NET程序)。带着这个问题,我开始Google,开始baidu,又开始编程了。和原来的搜索结果一样,什么东西都是一筹莫展,得到的答案永远是:C#没有办法自己去禁止别人用任务管理器结束自己进程。不过功夫不负有心人。我还是找到一大堆的替代方法,可以让别人不结束自己进程的方法。

    总结方法有:

    1. 把任务管理器程序给别人删除了,不让别人打开(妈呀,这个我觉得最不可取了,有点杀鸡取卵的味道,没有任务管理器,我是无法忍受的。毕竟人家用户,购买了你产品,你总不可能把别人任务管理器给洗白了吧?)否决!

    2. 接下来这个比较温柔,通过C#内置的Process类,对任务管理器的进程进行扫描,如果检查到有taskmgr.exe的进程(任务管理器进程),就把这个进程结束了。(虽然没有第一个来的恶劣,但是,用户还是不能使用任务管理器)否决!

    3. 写两个程序进行双保护。这个想法是网上提的最多的思路,如果一个程序被结束了,另一个程序检测到这个程序不在了,就立即重新启动该程序,双双保护,互助互利(结果我尝试了一下,不可取,因为1,CPU使用率太高,一直在循环检测,计算机速度立即就下了。我妈妈这个机子,P4的配置,1G内存,也来不起了。网页也卡起了。2,我写了一个第三方程序,以最快速率去结束这个两个进程,如果这两个进程为了节约CPU的使用率,而把扫描间隔时间隔的太开的话,立刻被我的程序洗白。所以,理论上这种方法,肯定是会被洗白的)否决

    4. 技术含量比较高了,通过Windows的驱动机制,把自己给隐藏了(把自己变成驱动),然后隐藏到系统中运行,在任务管理器完全找不到,其实我多喜欢这种方式的,但是,这个程序一弄出来,瑞星,Google,Hotmail,360卫士,全部当成病毒查出来了,我当时眼流花都要流出来了。他们都太不给面子,Google,Hotmail直接把我的附件删除了。随便我压缩,分包压缩,都逃不过他们的法眼。所以,我清楚的意识到,这种程序弄出来,在客户机器上,肯定是无法长久生存的。毕竟一个堂堂正正的程序,干嘛要去隐藏呢?所以。该条方案否决!

    5. 用第三方的VC++程序,辅助C#程序达到不让别人禁止C#进程的方法。哎,弄了半天,这种方法,我认为最行之有效。毕竟不得不承认,要搞Windows系统级的程序设计,C++是当之无愧的龙头老大,C#只是一个做网站级应用的能手。不过,你发布一个程序给用户,用户看到那个任务管理器里面还有个其他程序在运作或者是看到你的安装包里面怎么还有其他程序名字,确实感觉太不专业,太不地道了。话又说回来,这种辅助程序一般都要收费。我下载的那个就要收费。所以,最后,这个方案也否决了!

    难道,C#真的就不能自己弄个什么名堂的东西出来,不被任务管理器结束吗?实际,我认为,C#是可以做到这一点的。原因有2个。1,C#是支持带*号这种指针的方式的。也就是说,C#可以使用指针。2,C#可以完全无障碍的调用Windows自己的API函数(虽然性能没有VC++开发的好),调用第三方开发的COM组件,甚至调用USB插口接口相关信息(曾今做U盘杀毒的时候,用到过,不过主要还是结合API完成的,一个未公开的API函数R开头的忘记了)。所以,为此,我抱着信心开始准备找第三方提供的动态链接库之类的东西,毕竟要自己写,C#还是有许多性能和调用方面的麻烦问题要考虑,毕竟不是毕业设计,所以,能简单就简单,只要克服以上提到的5种方法的不足。

    最后,功夫不负有心人,找了大半天,找到了一个叫Peter的牛人,写了一个通过VC++程序调用VC++动态链接库,实现的VC++程序不被任务管理器结束的源代码。幸亏源代码相当详尽(VC++动态链接库的源码,VC++应用程序源码),要不然,后面的活路,就没有办法做了。于是我开始,慢慢,慢慢走上辛苦的VC++代码分析上。你们可能要问我干什么?我可以很坦然的告诉你,虽然我VC++能力确实不强,但是我要把VC++的代码,移植到C#上。听起来,很不可思意,但是,我真的成功了。最后,为了报答我的学校——成都电子机械高等专科学校和成都信息工程学院。我把VC++应用程序调用代码,移植到.NET上,并且,为了调用方便,我做成了.NET可以识别的dll运行库。只要按以下方式调用运行即可。这个dll运行库可以保护自己进程,也可以通过设置保护其他进程,作为第三方动态链接库存在。(很幸运,虽然这个第三方动态链接库我还是很花了些时间,但是绝对不收费,免费放送,提供C#工程源码下载!如果大家有兴趣也可以一起讨论一下,我的邮件是Email:k.liuxu@gmail.com),至于那个牛人的设计思路,其实,就是用系统函数挂钩,挂接了所有的系统函数消息。没有直接分析任务管理器这些东西。不过,在CMD命令控制台中,无法接受消息,所以,用命令控制台,是可以结束进程的。不过,命令控制台,一般用户不会使用,可以直接把命令控制台删除,或者移植到程序内部调用,不准用户外部调用,就行了。至于其他更麻烦的东西,就有兴趣大家在慢慢聊吧。

    前面分析VC++代码是一个艰苦的历程,简直是挥泪分析啊,眼睛都看肿了,才把VC++应用程序部分移植出来。其实总结了一下,实际上还是因为自己学习不扎实,所以才看的恼火,对不起电子高专培养我的刘光会和杨勇老师,对不起信息工程学院的安俊秀和陈晓红老师。不过最后弄出来了,还是一件好事情吧,也充分说明了C#还是可以搞一些基于系统级的调用和编程的。也许在大鸟眼睛中,移植这种工作并不算什么,这种程序也许是小儿科,不过,对于,刚刚毕业的我来说,还是一种不小的挑战。

    由于时间有限,我只把前半部分的VC++应用程序端移植完成,在以后的时间中,等我把Dll部分抽象出来,我会做成.NET可以识别的dll发布出来。如果还有时间,我就再来说说,我怎么分析的吧。不过这个可能要说很久很久了,毕竟涵盖了5年我大学学习的所有基础知识,大到系统,小到函数指针,代理,枚举这些结构,内存存储空间等等。好了废话不多说了。现在主要看看怎么使用。

    首先,我们必须具备两个DLL文件,一个是我用.NET程序生成的KProtectProcess.dll文件,这个文件可以直接放到VS.NET开发环境中进行使用。还有一个是我还没有编译出来的NKCore.dll文件(其实我移植了一半,但是里面设计很多系统关键字,我在C#中还没有找到很好的解决方案,所以正在研究),这个文件是C++的运行库,实际上核心也是这个文件。


    1首先我们新建立一个工程。如下:

    2.按照如图,放置这些控件,以便我们操作

    3.添加引用.NET可以识别的KProtectProcess.dll动态链接库(VB.NET,J#.NET,VC++.NET都可以调用)右键项目,选择添加引用:

    4.找到KProtectProcess.dll这个文件并添加(注意保持,KProtectProcess.dll文件和NKCore.dll文件在同一目录中)

    5.点确定以后,你会看到工程中,多了一个程序集KProtectProcess.dll

    6.双击,按钮进入代码的编写,(其中保护自己,停止保护自己,保护其他进程,停止保护其他进程按钮的名字分别是:button1,button2,button3,button4),具体调用代码编写如下(代码调用,已经简化的相当简单了):自身保护调用SelfProtection(),自身释放调用UnLoadProtection(),其他进程保护,首先调用ProtectProcessID赋值,然后调用ProtectProcess进行保护,如果不赋值,我会抛出一个异常。

    7. 所有工作都准备完毕就可以调试了。其中以下演示怎么保护其他进程。比如我们现在打开Windows计算器这个程序,计算器这个程序的进程名是calc.exe,所以,我们就找他的进程号PID.1764


    现在只需要在程序的进程号中输入,1764,然后点保护,最后,你看用任务管理器是不是不能结束calc这个程序了?很简单吧?

    展开全文
    chollima20080808 2014-06-05 15:53:04
  • 自己实现Linux系统任务管理器(附源码) 一、前言 之前在操作系统课程中,使用Java实现的任务管理器,使用了Swing界面、Runtime、Process相关类。文章总结和程序下载在下面: Java调用批处理或可执行文件和Runtime、...

    一、前言

            之前在操作系统课程中,使用Java实现的任务管理器,使用了Swing界面、Runtime、Process相关类。文章总结和程序下载在下面:

            Java调用批处理或可执行文件和Runtime、Process类实现Java版进程管理器:http://blog.csdn.net/ljheee/article/details/52067690

            Java进程管理器MyProcess.rar----免积分下载:http://download.csdn.net/detail/ljheee/9598423

            虽然基本功能实现了,Java跨平台的特性,也使得这个应用在Linux上跑,但是在实现这个版本之后就已经感觉到Java对操作系统信息的提取与封装是有限的,Process包含的进程信息有限,且操作不方便。

            因此最近在Linux课程中,决定用Qt界面+Linux方式实现自己的Linux版任务管理器。在程序设计之前,有必要先了解下Linux系统进程信息提取方式,因为这种“Linux方式”不像Java的Process类封装那样,不管底层,只管调用  process.getInputStream();去读取流。

    二、Linux下/proc目录简介

            Linux内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。

            系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的 PID号为目录名,它们是读取进程信息的接口。而self目录则是读取进程本身的信息接口,是一个link。

            直接打开自己安装的Linux系统,进入/proc,可以看到很多数字命名的文件夹;文件夹名的数字,代表当前运行的一个进程的PID,它是读取进程信息的接口。

    Linux下/proc下其他重要目录

    /proc/cpuinfo     --cpu的信息

    /proc/devices     --已经加载的设备并分类

    /proc/modules     --所有加载到内核的模块列表

    /proc/stat        --所有的CPU活动信息,可采点计算cpu的利用率

    /proc/version     --Linux内核版本和gcc版本

     

    三、Qt实现Linux版任务管理器

            用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。

            我们要显示系统信息,只需进行相应的文件操作就行了。

            Qt的发展势头相当猛,qt的可移植性相当强,现在应用程序做界面基本都用Qt。Qt是诺基亚开发的一个跨平台的C++图形用户界面应用程序框架。Qt商业版只能试用30天,不过有GPL版的,可以免费使用。有一个非常不错的免费Qt集成开发环境QtCreator IDE。Linux版任务管理器采用的是Qt来实现图形界面。

    步骤:

    1、Linux下安装Qt Creator,打开新建一个工程,工程目录下,相关文件会有6个,具体见下图--工程文件夹:

     

    编译完成后的实现效果:

    “内存信息”模块:

     

    “进程信息”模块:

     

    “模块信息”模块:

     

    “系统信息”模块:

     

    “关于”模块:

     

     

    完整源码如下:

    main.cpp    工程运行的入口,创建工程时自动创建的,不需要修改。

    #include <QApplication>
    #include "mainwindow.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
        
        return a.exec();
    }
    

    mainwindow.h  工程头文件,定义资源和事件响应函数声明。

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QFile>
    #include <QDir>
    #include <QTimer>
    #include <QMessageBox>
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
        
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
        
    private:
        Ui::MainWindow *ui;//界面资源类,所有的界面元素都是通过该类来调用
        QTimer *timer; //计时器
    
        private slots:
        void on_pushButton_pkill_clicked();
        void on_pushButton_prefresh_clicked();
        void on_pushButton_Model_install_clicked();
        void on_pushButton_Model_remove_clicked();
        void on_pushButton_Model_refresh_clicked();
        void on_pushButton_reboot_clicked();
        void on_pushButton_halt_clicked();
        void on_tabWidget_INFO_currentChanged(int index);
        void timer_update_currentTabInfo();
        //显示tab中的内容
        void show_tabWidgetInfo(int index);
    };
    
    #endif // MAINWINDOW_H

    mainwindow.cpp  工程最重要的源文件,完成主要的业务逻辑。

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QListWidget>
    #include <QListWidgetItem>
    #include <QStringList>
    
    int a0 = 0, a1 = 0, b0 = 0, b1 = 0;
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        timer = new QTimer(this);
        QWidget::connect( timer, SIGNAL( timeout() ), this, SLOT( timer_update_currentTabInfo() ) );//ui控件-事件响应
    
        QWidget::connect( ui->tabWidget_INFO, SIGNAL( currentChanged() ),
                          this, SLOT( on_tabWidget_currentChanged() ) );
        timer->start(1000);
    }
    
    
    
    
    MainWindow::~MainWindow()
    {
        delete ui;
        delete timer;
    }
    
    
    void MainWindow::timer_update_currentTabInfo()
    {
        int index = ui->tabWidget_INFO->currentIndex();
    
        //定时器只刷新内存tab页面,用于进度条动态显示
        if (index == 0)
        {
            show_tabWidgetInfo(index);
        }
    }
    
    void MainWindow::show_tabWidgetInfo(int index)
    {
        QString tempStr; //读取文件信息字符串
        QFile tempFile; //用于打开系统文件
        int pos; //读取文件的位置
    
        if (index == 0) //内存資源
        {
            tempFile.setFileName("/proc/meminfo"); //打开内存信息文件
            if ( !tempFile.open(QIODevice::ReadOnly) )
            {
                QMessageBox::warning(this, tr("warning"), tr("The meminfo file can not open!"), QMessageBox::Yes);
                return ;
            }
            QString memTotal;
            QString memFree;
            QString memUsed;
            QString swapTotal;
            QString swapFree;
            QString swapUsed;
            int nMemTotal, nMemFree, nMemUsed, nSwapTotal, nSwapFree, nSwapUsed;
    
            while (1)
            {
                tempStr = tempFile.readLine();
                pos = tempStr.indexOf("MemTotal");
                if (pos != -1)
                {
                    memTotal = tempStr.mid(pos+10, tempStr.length()-13);
                    memTotal = memTotal.trimmed();
                    nMemTotal = memTotal.toInt()/1024;
                }
                else if (pos = tempStr.indexOf("MemFree"), pos != -1)
                {
                    memFree = tempStr.mid(pos+9, tempStr.length()-12);
                    memFree = memFree.trimmed();
                    nMemFree = memFree.toInt()/1024;
                }
                else if (pos = tempStr.indexOf("SwapTotal"), pos != -1)
                {
                    swapTotal = tempStr.mid(pos+11, tempStr.length()-14);
                    swapTotal = swapTotal.trimmed();
                    nSwapTotal = swapTotal.toInt()/1024;
                }
                else if (pos = tempStr.indexOf("SwapFree"), pos != -1)
                {
                    swapFree = tempStr.mid(pos+10,tempStr.length()-13);
    
                    swapFree = swapFree.trimmed();
                    nSwapFree = swapFree.toInt()/1024;
                    break;
                }
            }
            nMemUsed = nMemTotal - nMemFree;
            nSwapUsed = nSwapTotal - nSwapFree;
            memUsed = QString::number(nMemUsed, 10);
            swapUsed = QString::number(nSwapUsed, 10);
            memFree = QString::number(nMemFree, 10);
            memTotal = QString::number(nMemTotal, 10);
            swapFree = QString::number(nSwapFree, 10);
            swapTotal = QString::number(nSwapTotal, 10);
    
            ui->label_RAM_Used->setText(memUsed+" MB");
            ui->label_RAM_Left->setText(memFree+" MB");
            ui->label_RAM_Total->setText(memTotal+" MB");
            ui->label_SWAP_Used->setText(swapUsed+" MB");
            ui->label_SWAP_Left->setText(swapFree+" MB");
            ui->label_SWAP_Total->setText(swapTotal+" MB");
    
            ui->progressBar_RAM->setValue(nMemUsed*100/nMemTotal);
            ui->progressBar_SWAP->setValue(nSwapUsed*100/nSwapTotal);
            tempFile.close(); //关闭内存信息文件
    
            int tt = 2; //取2个点采样计算cpu当前利用律
            int cpuInfo[2][7];
            int cpuTotal[2][2];
            while (tt)
            {
                tempFile.setFileName("/proc/stat"); //打开CPU使用状态信息
                if ( !tempFile.open(QIODevice::ReadOnly) )
                {
                    QMessageBox::warning(this, tr("warning"), tr("The stat file can not open!"), QMessageBox::Yes);
                    return;
                }
                tempStr = tempFile.readLine();
                for (int i = 0; i < 7; i++)
                {
                    cpuInfo[2-tt][i] = tempStr.section(" ", i+1, i+1).toInt();
                    cpuTotal[1][2-tt] += cpuInfo[2-tt][i];
                    if (i == 3)
                    {
                        cpuTotal[0][2-tt] += cpuInfo[2-tt][i];
                    }
                }
                tt--;
                tempFile.close(); //关闭stat文件
            }
            int a = cpuTotal[0][1] - cpuTotal[0][0];
            int b = cpuTotal[1][1] - cpuTotal[1][0];
            if (a < 0)
            {
                a = -a;
            }
            if (b < 0)
            {
                b = -b;
            }
            ui->progressBar_CPU->setValue(a*100/b);
            tempFile.setFileName("/proc/stat");  //linux下用/proc/stat文件来计算cpu的利用率
            //这个文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。
    
            if ( !tempFile.open(QIODevice::ReadOnly) )
            {
                QMessageBox::warning(this, tr("warning"), tr("The stat file can not open!"), QMessageBox::Yes);
                return;
            }
            tempStr = tempFile.readLine();
            a0 = a1;
            b0 = b1;
            a1 = b1 = 0;
            int gg;
            for (int i = 0; i < 7; i++)
            {
                b1 += tempStr.section(" ", i+2, i+2).toInt();
                gg = b1;
                if (i == 3)
                {
                    a1 += tempStr.section(" ", i+2, i+2).toInt();
                }
            }
            int m, n;
            m = a1 - a0;
            n = b1 - b0;
            if (m < 0)
            {
                m = -m;
            }
            if (n < 0)
            {
                n = -n;
            }
            ui->progressBar_CPU->setValue( (n-m)*100/n );
            tempFile.close(); //关闭stat文件
        }
            else if (index == 1) //进程信息
            {
                ui->listWidget_process->clear();
                QDir qd("/proc");
                QStringList qsList = qd.entryList();
                QString qs = qsList.join("\n");
                QString id_of_pro;
                bool ok;
                int find_start = 3;
                int a, b;
                int nProPid; //进程PID
                int number_of_sleep = 0, number_of_run = 0, number_of_zombie = 0;
                int totalProNum = 0; //进程总数
                QString proName; //进程名
                QString proState; //进程状态
                QString proPri; //进程优先级
                QString proMem; //进程占用内存
                QListWidgetItem *title = new QListWidgetItem("PID\t" + QString::fromUtf8("名称") + "\t\t" +
                                                             QString::fromUtf8("状态") + "\t" +
                                                             QString::fromUtf8("优先级") + "\t" +
                                                             QString::fromUtf8("占用内存"), ui->listWidget_process);
                //循环读取进程
                while (1)
                {
                    //获取进程PID
                    a = qs.indexOf("\n", find_start);
                    b = qs.indexOf("\n", a+1);
                    find_start = b;
                    id_of_pro = qs.mid(a+1, b-a-1);
                    totalProNum++;
                    nProPid = id_of_pro.toInt(&ok, 10);
                    if(!ok)
                    {
                        break;
                    }
    
                    //打开PID所对应的进程状态文件
                    tempFile.setFileName("/proc/" + id_of_pro + "/stat");
                    if ( !tempFile.open(QIODevice::ReadOnly) )
                    {
                        QMessageBox::warning(this, tr("warning"), tr("The pid stat file can not open!"), QMessageBox::Yes);
                        return;
                    }
                    tempStr = tempFile.readLine();
                    if (tempStr.length() == 0)
                    {
                        break;
                    }
                    a = tempStr.indexOf("(");
                    b = tempStr.indexOf(")");
                    proName = tempStr.mid(a+1, b-a-1);
                    proName.trimmed(); //删除两端的空格
                    proState = tempStr.section(" ", 2, 2);
                    proPri = tempStr.section(" ", 17, 17);
                    proMem = tempStr.section(" ", 22, 22);
                    switch ( proState.at(0).toLatin1() )
                    {
                    case 'S':   number_of_sleep++; break; //Sleep
                    case 'R':   number_of_run++; break; //Running
                    case 'Z':   number_of_zombie++; break; //Zombie
                    default :   break;
                    }
                    if (proName.length() >= 12)
                    {
                        QListWidgetItem *item = new QListWidgetItem(id_of_pro + "\t" +
                                                                    proName + "\t" +
                                                                    proState + "\t" +
                                                                    proPri + "\t" +
                                                                    proMem, ui->listWidget_process);
                    }
                    else
                    {
                        QListWidgetItem *item = new QListWidgetItem(id_of_pro + "\t" +
                                                                    proName + "\t\t" +
                                                                    proState + "\t" +
                                                                    proPri + "\t" +
                                                                    proMem, ui->listWidget_process);
                    }
                }
                QString temp;
                temp = QString::number(totalProNum, 10);
                ui->label_pNum->setText(temp);
                temp = QString::number(number_of_run, 10);
                ui->label_pRun->setText(temp);
                temp = QString::number(number_of_sleep, 10);
                ui->label_pSleep->setText(temp);
                temp = QString::number(number_of_zombie, 10);
                ui->label_pZombie->setText(temp);
                tempFile.close(); //关闭该PID进程的状态文件
            }
            else if (index == 2) //模块信息
            {
                ui->listWidget_model->clear();
                //sys/module 是一个 sysfs 目录层次, 包含当前加载模块的信息. /proc/moudles 是旧式的, 那种信息的单个文件版本. 其中的条目包含了模块名, 每个模块占用的内存数量, 以及使用计数. 另外的字串追加到每行的末尾来指定标志, 对这个模块当前是活动的.
                tempFile.setFileName("/proc/modules"); //打开模块信息文件
                if ( !tempFile.open(QIODevice::ReadOnly) )
                {
                    QMessageBox::warning(this, tr("warning"), tr("The modules file can not open!"), QMessageBox::Yes);
                    return ;
                }
                //设置模块首行项目
                QListWidgetItem *title = new QListWidgetItem( QString::fromUtf8("名称") + "\t\t\t" +
                                                              QString::fromUtf8("使用内存数") + "\t\t" +
                                                              QString::fromUtf8("使用次數"), ui->listWidget_model);
                QString mod_Name, mod_Mem, mod_Num;
                //循环读取文件内容,查找需要的信息
                while (1)
                {
                    tempStr = tempFile.readLine();
                    if (tempStr.length() == 0)
                    {
                        break;
                    }
                    mod_Name = tempStr.section(" ", 0, 0);
                    mod_Mem = tempStr.section(" ", 1, 1);
                    mod_Num = tempStr.section(" ", 2, 2);
                    if (mod_Name.length() > 10)
                    {
                        QListWidgetItem *item = new QListWidgetItem(mod_Name + "\t\t" +
                                                                    mod_Mem + "\t\t" +
                                                                    mod_Num, ui->listWidget_model);
                    }
                    else
                    {
                        QListWidgetItem *item = new QListWidgetItem(mod_Name + "\t\t\t" +
                                                                    mod_Mem + "\t\t" +
                                                                    mod_Num, ui->listWidget_model);
                    }
                }
                tempFile.close(); //关闭模块信息文件
    
            }
            else if (index == 3) //系统信息
            {
                //int ok;
                tempFile.setFileName("/proc/cpuinfo"); //打开CPU信息文件
                if ( !tempFile.open(QIODevice::ReadOnly) )
                {
                    QMessageBox::warning(this, tr("warning"), tr("The cpuinfo file can not open!"), QMessageBox::Yes);
                    return;
                }
    
                //循环读取文件内容,查找需要的信息
                while (1)
                {
    
                    tempStr = tempFile.readLine();
    
                    //QMessageBox::warning(this, tr("msg"), tempStr, QMessageBox::Yes);
    
                    if(tempStr==NULL){//文件读完,跳出
                        break;
                    }
    
                    pos = tempStr.indexOf("model name");
                    if (pos != -1)
                    {
                        pos += 13; //跳过前面的"model name:"所占用的字符
                        QString *cpu_name = new QString( tempStr.mid(pos, tempStr.length()-13) );
                        ui->label_CPUName->setText(*cpu_name);
                    }
                    else if (pos = tempStr.indexOf("vendor_id"), pos != -1)
                    {
                        pos += 12; //跳过前面的"vendor_id:"所占用的字符
                        QString *cpu_type = new QString( tempStr.mid(pos, tempStr.length()-12) );
                        ui->label_CPUType->setText(*cpu_type);
                    }
                    else if (pos = tempStr.indexOf("cpu MHz"), pos != -1)
                    {
                        pos += 11; //跳过前面的"cpu MHz:"所占用的字符
                        QString *cpu_frq = new QString( tempStr.mid(pos, tempStr.length()-11) );
                        double cpufrq = cpu_frq->toDouble(); //4核CPU
                        cpu_frq->setNum(cpufrq*4);
                        ui->label_CPUFrequency->setText(*cpu_frq + " HZ");
                    }
                    else if (pos = tempStr.indexOf("cache size"), pos!=-1)
                    {
                        pos += 13; //跳过前面的"cache size:"所占用的字符
                        QString *cache_size = new QString( tempStr.mid(pos, tempStr.length()-16) );
                        int cachesize = cache_size->toInt(); //4核CPU
                        cache_size->setNum(cachesize*4);
                        ui->label_CatheCapacity->setText(*cache_size + " KB");
                    }
                    else //跳过其他的内容
                    {
                    }
                }
                tempFile.close(); //关闭CPU信息文件
                //打开操作系统信息文件
                tempFile.setFileName("/proc/version");
                if ( !tempFile.open(QIODevice::ReadOnly) )
                {
                    QMessageBox::warning(this, tr("warning"), tr("The version file can not open!"), QMessageBox::Yes);
                    return ;
                }
                tempStr = tempFile.readLine();
                pos = tempStr.indexOf("version");
                QString *os_version = new QString( tempStr.mid(0, pos-1) );
                ui->label_SystemType->setText(*os_version);
                int pos1 = tempStr.indexOf("(");
                QString *os_type = new QString( tempStr.mid(pos, pos1-pos-1) );
                ui->label_SystemVersion->setText(*os_type);
                pos = tempStr.indexOf("gcc version");
                pos1 = tempStr.indexOf("#");
                QString *gcc_info = new QString( tempStr.mid(pos+12, pos1-pos-14) );
                ui->label_GCCVersion->setText(*gcc_info);
                tempFile.close(); //关闭操作系统信息文件
            }
                else //说明
                {
                }
                return;
            }
    
            void MainWindow::on_pushButton_halt_clicked()
            {
                system("halt");
            }
    
            void MainWindow::on_pushButton_reboot_clicked()
            {
                system("reboot");
            }
    
            void MainWindow::on_tabWidget_INFO_currentChanged(int index)
            {
                show_tabWidgetInfo(index); //显示tab中的内容
                return ;
            }
    
            //杀死进程
            void MainWindow::on_pushButton_pkill_clicked()
            {
                //获得进程号
                QListWidgetItem *item = ui->listWidget_process->currentItem();
                QString pro = item->text();
                pro = pro.section("\t", 0, 0);
                system("kill " + pro.toLatin1());
                QMessageBox::warning(this, tr("kill"), QString::fromUtf8("该进程已被杀死!"), QMessageBox::Yes);
                //回到进程信息tab表
                show_tabWidgetInfo(1);
            }
    
            //刷新进程信息
            void MainWindow::on_pushButton_prefresh_clicked()
            {
                show_tabWidgetInfo(1);
            }
    
            void MainWindow::on_pushButton_Model_install_clicked()
            {
                show_tabWidgetInfo(2); //安装模块还不知道如何实现
                 QMessageBox::warning(this, tr("tip"), tr("安装模块还不知道如何实现"), QMessageBox::Yes);
            }
    
            void MainWindow::on_pushButton_Model_remove_clicked()
            {
                show_tabWidgetInfo(2);
                //卸载模块还不知道如何实现
                QMessageBox::warning(this, tr("tip"), tr("卸载模块还不知道如何实现"), QMessageBox::Yes);
            }
    
    
            void MainWindow::on_pushButton_Model_refresh_clicked()
            {
                show_tabWidgetInfo(2);
                QMessageBox::warning(this, tr("tip"), tr("刷新模块还不知道如何实现"), QMessageBox::Yes);
            }

    Mainwindow.ui 工程界面文件。

    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>MainWindow</class>
     <widget class="QMainWindow" name="MainWindow">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>605</width>
        <height>438</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>MainWindow</string>
      </property>
      <widget class="QWidget" name="centralWidget">
       <widget class="QTabWidget" name="tabWidget_INFO">
        <property name="geometry">
         <rect>
          <x>0</x>
          <y>-10</y>
          <width>611</width>
          <height>341</height>
         </rect>
        </property>
        <property name="cursor">
         <cursorShape>WaitCursor</cursorShape>
        </property>
        <property name="tabShape">
         <enum>QTabWidget::Triangular</enum>
        </property>
        <property name="currentIndex">
         <number>3</number>
        </property>
        <property name="movable">
         <bool>false</bool>
        </property>
        <widget class="QWidget" name="MemoryInfo">
         <property name="toolTip">
          <string><html><head/><body><p>内存信息</p></body></html></string>
         </property>
         <property name="whatsThis">
          <string><html><head/><body><p>内存信息</p></body></html></string>
         </property>
         <attribute name="title">
          <string>内存信息</string>
         </attribute>
         <widget class="QGroupBox" name="groupBox">
          <property name="geometry">
           <rect>
            <x>0</x>
            <y>0</y>
            <width>591</width>
            <height>81</height>
           </rect>
          </property>
          <property name="title">
           <string>CPU</string>
          </property>
          <widget class="QProgressBar" name="progressBar_CPU">
           <property name="geometry">
            <rect>
             <x>50</x>
             <y>30</y>
             <width>431</width>
             <height>23</height>
            </rect>
           </property>
           <property name="value">
            <number>24</number>
           </property>
          </widget>
          <widget class="QLabel" name="label_11">
           <property name="geometry">
            <rect>
             <x>0</x>
             <y>30</y>
             <width>66</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>CPU:</string>
           </property>
          </widget>
         </widget>
         <widget class="QGroupBox" name="groupBox_2">
          <property name="geometry">
           <rect>
            <x>0</x>
            <y>80</y>
            <width>591</width>
            <height>231</height>
           </rect>
          </property>
          <property name="title">
           <string>内存和交换分区</string>
          </property>
          <widget class="QProgressBar" name="progressBar_RAM">
           <property name="geometry">
            <rect>
             <x>50</x>
             <y>50</y>
             <width>431</width>
             <height>23</height>
            </rect>
           </property>
           <property name="value">
            <number>24</number>
           </property>
          </widget>
          <widget class="QProgressBar" name="progressBar_SWAP">
           <property name="geometry">
            <rect>
             <x>50</x>
             <y>140</y>
             <width>431</width>
             <height>23</height>
            </rect>
           </property>
           <property name="value">
            <number>24</number>
           </property>
          </widget>
          <widget class="QLabel" name="label_9">
           <property name="geometry">
            <rect>
             <x>0</x>
             <y>50</y>
             <width>66</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>内存:</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_10">
           <property name="geometry">
            <rect>
             <x>0</x>
             <y>140</y>
             <width>66</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>交换</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_12">
           <property name="geometry">
            <rect>
             <x>50</x>
             <y>80</y>
             <width>66</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>Used:</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_13">
           <property name="geometry">
            <rect>
             <x>200</x>
             <y>80</y>
             <width>66</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>Left:</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_14">
           <property name="geometry">
            <rect>
             <x>380</x>
             <y>80</y>
             <width>66</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>Total:</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_15">
           <property name="geometry">
            <rect>
             <x>380</x>
             <y>170</y>
             <width>66</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>Total:</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_16">
           <property name="geometry">
            <rect>
             <x>50</x>
             <y>170</y>
             <width>66</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>Used:</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_20">
           <property name="geometry">
            <rect>
             <x>200</x>
             <y>170</y>
             <width>66</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>Left:</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_RAM_Used">
           <property name="geometry">
            <rect>
             <x>90</x>
             <y>80</y>
             <width>66</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>0</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_RAM_Left">
           <property name="geometry">
            <rect>
             <x>240</x>
             <y>80</y>
             <width>66</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>0</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_RAM_Total">
           <property name="geometry">
            <rect>
             <x>420</x>
             <y>80</y>
             <width>66</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>0</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_SWAP_Total">
           <property name="geometry">
            <rect>
             <x>420</x>
             <y>170</y>
             <width>66</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>0</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_SWAP_Used">
           <property name="geometry">
            <rect>
             <x>90</x>
             <y>170</y>
             <width>66</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>0</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_SWAP_Left">
           <property name="geometry">
            <rect>
             <x>240</x>
             <y>170</y>
             <width>66</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>0</string>
           </property>
          </widget>
         </widget>
        </widget>
        <widget class="QWidget" name="Process">
         <attribute name="title">
          <string>进程信息</string>
         </attribute>
         <widget class="QListWidget" name="listWidget_process">
          <property name="geometry">
           <rect>
            <x>0</x>
            <y>0</y>
            <width>421</width>
            <height>271</height>
           </rect>
          </property>
         </widget>
         <widget class="QPushButton" name="pushButton_pkill">
          <property name="geometry">
           <rect>
            <x>20</x>
            <y>280</y>
            <width>98</width>
            <height>27</height>
           </rect>
          </property>
          <property name="text">
           <string>kill</string>
          </property>
         </widget>
         <widget class="QPushButton" name="pushButton_prefresh">
          <property name="geometry">
           <rect>
            <x>170</x>
            <y>280</y>
            <width>98</width>
            <height>27</height>
           </rect>
          </property>
          <property name="text">
           <string>refresh</string>
          </property>
         </widget>
         <widget class="QLabel" name="label">
          <property name="geometry">
           <rect>
            <x>430</x>
            <y>30</y>
            <width>66</width>
            <height>17</height>
           </rect>
          </property>
          <property name="text">
           <string>进程数:</string>
          </property>
         </widget>
         <widget class="QLabel" name="label_pNum">
          <property name="geometry">
           <rect>
            <x>490</x>
            <y>30</y>
            <width>66</width>
            <height>17</height>
           </rect>
          </property>
          <property name="text">
           <string>0</string>
          </property>
         </widget>
         <widget class="QLabel" name="label_2">
          <property name="geometry">
           <rect>
            <x>430</x>
            <y>60</y>
            <width>66</width>
            <height>17</height>
           </rect>
          </property>
          <property name="text">
           <string>运行数:</string>
          </property>
         </widget>
         <widget class="QLabel" name="label_3">
          <property name="geometry">
           <rect>
            <x>430</x>
            <y>100</y>
            <width>66</width>
            <height>17</height>
           </rect>
          </property>
          <property name="text">
           <string>睡眠数:</string>
          </property>
         </widget>
         <widget class="QLabel" name="label_4">
          <property name="geometry">
           <rect>
            <x>430</x>
            <y>140</y>
            <width>66</width>
            <height>17</height>
           </rect>
          </property>
          <property name="text">
           <string>浆死数:</string>
          </property>
         </widget>
         <widget class="QLabel" name="label_pRun">
          <property name="geometry">
           <rect>
            <x>490</x>
            <y>60</y>
            <width>66</width>
            <height>17</height>
           </rect>
          </property>
          <property name="text">
           <string>0</string>
          </property>
         </widget>
         <widget class="QLabel" name="label_pSleep">
          <property name="geometry">
           <rect>
            <x>490</x>
            <y>100</y>
            <width>66</width>
            <height>17</height>
           </rect>
          </property>
          <property name="text">
           <string>0</string>
          </property>
         </widget>
         <widget class="QLabel" name="label_pZombie">
          <property name="geometry">
           <rect>
            <x>490</x>
            <y>140</y>
            <width>66</width>
            <height>17</height>
           </rect>
          </property>
          <property name="text">
           <string>0</string>
          </property>
         </widget>
        </widget>
        <widget class="QWidget" name="Module">
         <attribute name="title">
          <string>模块信息</string>
         </attribute>
         <widget class="QPushButton" name="pushButton_Model_install">
          <property name="geometry">
           <rect>
            <x>20</x>
            <y>280</y>
            <width>98</width>
            <height>27</height>
           </rect>
          </property>
          <property name="text">
           <string>Install</string>
          </property>
         </widget>
         <widget class="QPushButton" name="pushButton_Model_remove">
          <property name="geometry">
           <rect>
            <x>180</x>
            <y>280</y>
            <width>98</width>
            <height>27</height>
           </rect>
          </property>
          <property name="text">
           <string>Romove</string>
          </property>
         </widget>
         <widget class="QPushButton" name="pushButton_Model_refresh">
          <property name="geometry">
           <rect>
            <x>350</x>
            <y>280</y>
            <width>98</width>
            <height>27</height>
           </rect>
          </property>
          <property name="text">
           <string>refresh</string>
          </property>
         </widget>
         <widget class="QListWidget" name="listWidget_model">
          <property name="geometry">
           <rect>
            <x>0</x>
            <y>0</y>
            <width>561</width>
            <height>271</height>
           </rect>
          </property>
         </widget>
        </widget>
        <widget class="QWidget" name="System">
         <attribute name="title">
          <string>系统信息</string>
         </attribute>
         <widget class="QGroupBox" name="groupBox_3">
          <property name="geometry">
           <rect>
            <x>0</x>
            <y>0</y>
            <width>591</width>
            <height>171</height>
           </rect>
          </property>
          <property name="title">
           <string>处理器信息</string>
          </property>
          <widget class="QLabel" name="label_5">
           <property name="geometry">
            <rect>
             <x>50</x>
             <y>30</y>
             <width>66</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>CPU名称:</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_6">
           <property name="geometry">
            <rect>
             <x>50</x>
             <y>60</y>
             <width>66</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>CPU类型:</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_7">
           <property name="geometry">
            <rect>
             <x>50</x>
             <y>90</y>
             <width>66</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>CPU频率:</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_8">
           <property name="geometry">
            <rect>
             <x>50</x>
             <y>120</y>
             <width>81</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>Cache大小:</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_CPUName">
           <property name="geometry">
            <rect>
             <x>140</x>
             <y>30</y>
             <width>321</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>未知</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_CPUType">
           <property name="geometry">
            <rect>
             <x>140</x>
             <y>60</y>
             <width>151</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>未知</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_CPUFrequency">
           <property name="geometry">
            <rect>
             <x>140</x>
             <y>90</y>
             <width>66</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>未知</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_CatheCapacity">
           <property name="geometry">
            <rect>
             <x>140</x>
             <y>120</y>
             <width>66</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>未知</string>
           </property>
          </widget>
         </widget>
         <widget class="QGroupBox" name="groupBox_4">
          <property name="geometry">
           <rect>
            <x>0</x>
            <y>180</y>
            <width>591</width>
            <height>121</height>
           </rect>
          </property>
          <property name="title">
           <string>操作系统信息</string>
          </property>
          <widget class="QLabel" name="label_17">
           <property name="geometry">
            <rect>
             <x>70</x>
             <y>30</y>
             <width>111</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>操作系统类型:</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_18">
           <property name="geometry">
            <rect>
             <x>70</x>
             <y>60</y>
             <width>111</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>操作系统版本:</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_19">
           <property name="geometry">
            <rect>
             <x>70</x>
             <y>90</y>
             <width>111</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>GCC编译器:</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_SystemType">
           <property name="geometry">
            <rect>
             <x>190</x>
             <y>30</y>
             <width>151</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>未知</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_SystemVersion">
           <property name="geometry">
            <rect>
             <x>190</x>
             <y>60</y>
             <width>281</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>未知</string>
           </property>
          </widget>
          <widget class="QLabel" name="label_GCCVersion">
           <property name="geometry">
            <rect>
             <x>190</x>
             <y>90</y>
             <width>291</width>
             <height>17</height>
            </rect>
           </property>
           <property name="text">
            <string>未知</string>
           </property>
          </widget>
         </widget>
        </widget>
        <widget class="QWidget" name="tab">
         <attribute name="title">
          <string>关于</string>
         </attribute>
         <widget class="QLabel" name="label_21">
          <property name="geometry">
           <rect>
            <x>20</x>
            <y>30</y>
            <width>66</width>
            <height>17</height>
           </rect>
          </property>
          <property name="text">
           <string>项目名:</string>
          </property>
         </widget>
         <widget class="QLabel" name="label_22">
          <property name="geometry">
           <rect>
            <x>100</x>
            <y>30</y>
            <width>191</width>
            <height>17</height>
           </rect>
          </property>
          <property name="text">
           <string>Linux下Qt实现任务管理器</string>
          </property>
         </widget>
         <widget class="QLabel" name="label_23">
          <property name="geometry">
           <rect>
            <x>100</x>
            <y>70</y>
            <width>191</width>
            <height>17</height>
           </rect>
          </property>
          <property name="text">
           <string>ljheee  </string>
          </property>
         </widget>
         <widget class="QLabel" name="label_24">
          <property name="geometry">
           <rect>
            <x>20</x>
            <y>70</y>
            <width>66</width>
            <height>17</height>
           </rect>
          </property>
          <property name="text">
           <string>作者:</string>
          </property>
         </widget>
         <widget class="QLabel" name="label_25">
          <property name="geometry">
           <rect>
            <x>100</x>
            <y>110</y>
            <width>191</width>
            <height>17</height>
           </rect>
          </property>
          <property name="text">
           <string>2017-4-10</string>
          </property>
         </widget>
         <widget class="QLabel" name="label_26">
          <property name="geometry">
           <rect>
            <x>20</x>
            <y>110</y>
            <width>66</width>
            <height>17</height>
           </rect>
          </property>
          <property name="text">
           <string>时间:</string>
          </property>
         </widget>
         <widget class="QLabel" name="label_27">
          <property name="geometry">
           <rect>
            <x>100</x>
            <y>150</y>
            <width>191</width>
            <height>17</height>
           </rect>
          </property>
          <property name="text">
           <string>QQ554278334</string>
          </property>
         </widget>
         <widget class="QLabel" name="label_28">
          <property name="geometry">
           <rect>
            <x>20</x>
            <y>150</y>
            <width>66</width>
            <height>17</height>
           </rect>
          </property>
          <property name="text">
           <string>联系:</string>
          </property>
         </widget>
        </widget>
       </widget>
       <widget class="QPushButton" name="pushButton_reboot">
        <property name="geometry">
         <rect>
          <x>380</x>
          <y>340</y>
          <width>98</width>
          <height>27</height>
         </rect>
        </property>
        <property name="text">
         <string>reboot</string>
        </property>
       </widget>
       <widget class="QPushButton" name="pushButton_halt">
        <property name="geometry">
         <rect>
          <x>500</x>
          <y>340</y>
          <width>98</width>
          <height>27</height>
         </rect>
        </property>
        <property name="text">
         <string>shutdown</string>
        </property>
       </widget>
      </widget>
      <widget class="QMenuBar" name="menuBar">
       <property name="geometry">
        <rect>
         <x>0</x>
         <y>0</y>
         <width>605</width>
         <height>26</height>
        </rect>
       </property>
       <widget class="QMenu" name="menuSysMontior">
        <property name="title">
         <string>SysMontior</string>
        </property>
       </widget>
       <addaction name="menuSysMontior"/>
      </widget>
      <widget class="QToolBar" name="mainToolBar">
       <attribute name="toolBarArea">
        <enum>TopToolBarArea</enum>
       </attribute>
       <attribute name="toolBarBreak">
        <bool>false</bool>
       </attribute>
      </widget>
      <widget class="QStatusBar" name="statusBar"/>
     </widget>
     <layoutdefault spacing="6" margin="11"/>
     <resources/>
     <connections/>
    </ui>
    

     Qt实现Linux任务管理器SysMonitor.ziphttp://download.csdn.net/detail/ljheee/9817990

     

     

     

     

     

     

     

    展开全文
    ljheee 2017-04-18 16:50:23
  • 哎,突然间,老毛病又烦了,想起原来一直有个编程的问题没有解决——禁止别人用任务管理器,结束自己的程序进程(.NET程序)。带着这个问题,我开始Google,开始baidu,又开始编程了。和原来的搜索结果一样,什么东西...

    闲来无事,英语又学的太痛苦。看到我妈妈电脑开起在,就坐上去看看新闻,听听音乐。哎,突然间,老毛病又烦了,想起原来一直有个编程的问题没有解决——禁止别人用任务管理器,结束自己的程序进程(.NET程序)。带着这个问题,我开始Google,开始baidu,又开始编程了。和原来的搜索结果一样,什么东西都是一筹莫展,得到的答案永远是:C#没有办法自己去禁止别人用任务管理器结束自己进程。不过功夫不负有心人。我还是找到一大堆的替代方法,可以让别人不结束自己进程的方法。

          

     

     

    总结方法有:

        

     

     

    1.      把任务管理器程序给别人删除了,不让别人打开(妈呀,这个我觉得最不可取了,有点杀鸡取卵的味道,没有任务管理器,我是无法忍受的。毕竟人家用户,购买了你产品,你总不可能把别人任务管理器给洗白了吧?)否决!

        

     

     

    2.      接下来这个比较温柔,通过C#内置的Process类,对任务管理器的进程进行扫描,如果检查到有taskmgr.exe的进程(任务管理器进程),就把这个进程结束了。(虽然没有第一个来的恶劣,但是,用户还是不能使用任务管理器)否决!

          

     

     

    3.      写两个程序进行双保护。这个想法是网上提的最多的思路,如果一个程序被结束了,另一个程序检测到这个程序不在了,就立即重新启动该程序,双双保护,互助互利(结果我尝试了一下,不可取,因为1,CPU使用率太高,一直在循环检测,计算机速度立即就下了。我妈妈这个机子,P4的配置,1G内存,也来不起了。网页也卡起了。2,我写了一个第三方程序,以最快速率去结束这个两个进程,如果这两个进程为了节约CPU的使用率,而把扫描间隔时间隔的太开的话,立刻被我的程序洗白。所以,理论上这种方法,肯定是会被洗白的)否决

         

     

     

    4.      技术含量比较高了,通过Windows的驱动机制,把自己给隐藏了(把自己变成驱动),然后隐藏到系统中运行,在任务管理器完全找不到,其实我多喜欢这种方式的,但是,这个程序一弄出来,瑞星,Google,Hotmail,360卫士,全部当成病毒查出来了,我当时眼流花都要流出来了。他们都太不给面子,Google,Hotmail直接把我的附件删除了。随便我压缩,分包压缩,都逃不过他们的法眼。所以,我清楚的意识到,这种程序弄出来,在客户机器上,肯定是无法长久生存的。毕竟一个堂堂正正的程序,干嘛要去隐藏呢?所以。该条方案否决!

          

     

     

    5.      用第三方的VC++程序,辅助C#程序达到不让别人禁止C#进程的方法。哎,弄了半天,这种方法,我认为最行之有效。毕竟不得不承认,要搞Windows系统级的程序设计,C++是当之无愧的龙头老大,C#只是一个做网站级应用的能手。不过,你发布一个程序给用户,用户看到那个任务管理器里面还有个其他程序在运作或者是看到你的安装包里面怎么还有其他程序名字,确实感觉太不专业,太不地道了。话又说回来,这种辅助程序一般都要收费。我下载的那个就要收费。所以,最后,这个方案也否决了!

           

     

     

    难道,C#真的就不能自己弄个什么名堂的东西出来,不被任务管理器结束吗?实际,我认为,C#是可以做到这一点的。原因有2个。1,C#是支持带*号这种指针的方式的。也就是说,C#可以使用指针。2,C#可以完全无障碍的调用Windows自己的API函数(虽然性能没有VC++开发的好),调用第三方开发的COM组件,甚至调用USB插口接口相关信息(曾今做U盘杀毒的时候,用到过,不过主要还是结合API完成的,一个未公开的API函数R开头的忘记了)。所以,为此,我抱着信心开始准备找第三方提供的动态链接库之类的东西,毕竟要自己写,C#还是有许多性能和调用方面的麻烦问题要考虑,毕竟不是毕业设计,所以,能简单就简单,只要克服以上提到的5种方法的不足。

          

     

     

    最后,功夫不负有心人,找了大半天,找到了一个叫Peter的牛人,写了一个通过VC++程序调用VC++动态链接库,实现的VC++程序不被任务管理器结束的源代码。幸亏源代码相当详尽(VC++动态链接库的源码,VC++应用程序源码),要不然,后面的活路,就没有办法做了。于是我开始,慢慢,慢慢走上辛苦的VC++代码分析上。你们可能要问我干什么?我可以很坦然的告诉你,虽然我VC++能力确实不强,但是我要把VC++的代码,移植到C#上。听起来,很不可思意,但是,我真的成功了。最后,为了报答我的学校——成都电子机械高等专科学校和成都信息工程学院。我把VC++应用程序调用代码,移植到.NET上,并且,为了调用方便,我做成了.NET可以识别的dll运行库。只要按以下方式调用运行即可。这个dll运行库可以保护自己进程,也可以通过设置保护其他进程,作为第三方动态链接库存在。(很幸运,虽然这个第三方动态链接库我还是很花了些时间,但是绝对不收费,免费放送,提供C#工程源码下载!如果大家有兴趣也可以一起讨论一下,我的邮件是Email:k.liuxu@gmail.com),至于那个牛人的设计思路,其实,就是用系统函数挂钩,挂接了所有的系统函数消息。没有直接分析任务管理器这些东西。不过,在CMD命令控制台中,无法接受消息,所以,用命令控制台,是可以结束进程的。不过,命令控制台,一般用户不会使用,可以直接把命令控制台删除,或者移植到程序内部调用,不准用户外部调用,就行了。至于其他更麻烦的东西,就有兴趣大家在慢慢聊吧。

         

     

     

    前面分析VC++代码是一个艰苦的历程,简直是挥泪分析啊,眼睛都看肿了,才把VC++应用程序部分移植出来。其实总结了一下,实际上还是因为自己学习不扎实,所以才看的恼火,对不起电子高专培养我的刘光会和杨勇老师,对不起信息工程学院的安俊秀和陈晓红老师。不过最后弄出来了,还是一件好事情吧,也充分说明了C#还是可以搞一些基于系统级的调用和编程的。也许在大鸟眼睛中,移植这种工作并不算什么,这种程序也许是小儿科,不过,对于,刚刚毕业的我来说,还是一种不小的挑战。

          

     

     

    由于时间有限,我只把前半部分的VC++应用程序端移植完成,在以后的时间中,等我把Dll部分抽象出来,我会做成.NET可以识别的dll发布出来。如果还有时间,我就再来说说,我怎么分析的吧。不过这个可能要说很久很久了,毕竟涵盖了5年我大学学习的所有基础知识,大到系统,小到函数指针,代理,枚举这些结构,内存存储空间等等。好了废话不多说了。现在主要看看怎么使用。

     

        首先,我们必须具备两个DLL文件,一个是我用.NET程序生成的KProtectProcess.dll文件,这个文件可以直接放到VS.NET开发环境中进行使用。还有一个是我还没有编译出来的NKCore.dll文件(其实我移植了一半,但是里面设计很多系统关键字,我在C#中还没有找到很好的解决方案,所以正在研究),这个文件是C++的运行库,实际上核心也是这个文件。

         

     

     


        1首先我们新建立一个工程。如下:

       

     

    2.按照如图,放置这些控件,以便我们操作

     

     

     

    3.添加引用.NET可以识别的KProtectProcess.dll动态链接库(VB.NET,J#.NET,VC++.NET都可以调用)右键项目,选择添加引用:

     

     

          

     

     

     

    4.找到KProtectProcess.dll这个文件并添加(注意保持,KProtectProcess.dll文件和NKCore.dll文件在同一目录中)

     

    5.点确定以后,你会看到工程中,多了一个程序集KProtectProcess.dll

             

     

     

    6.双击,按钮进入代码的编写,(其中保护自己,停止保护自己,保护其他进程,停止保护其他进程按钮的名字分别是:button1,button2,button3,button4),具体调用代码编写如下(代码调用,已经简化的相当简单了):自身保护调用SelfProtection(),自身释放调用UnLoadProtection(),其他进程保护,首先调用ProtectProcessID赋值,然后调用ProtectProcess进行保护,如果不赋值,我会抛出一个异常。

     

     

     

     

     

     

     

     

    7.       所有工作都准备完毕就可以调试了。其中以下演示怎么保护其他进程。比如我们现在打开Windows计算器这个程序,计算器这个程序的进程名是calc.exe,所以,我们就找他的进程号PID.1764

     

      

                    

     

       

     

             

     

     

         现在只需要在程序的进程号中输入,1764,然后点保护,最后,你看用任务管理器是不是不能结束calc这个程序了?很简单吧?

          

               

     

                     

                                

     结束语:

      

    (1).NET程序原代码下载地址为(大小47KB):TestClose.rar

        

    (2)两个动态连接库文件(大小14KB):Dll.rar

         

    (3).NET可识别的Dll我移植出来的.cs文件(7KB):KProcess.rar

          

    (4)VC++原始代码文件(大小10KB):vc.rar

           

     

     

       以上程序使用的是VisualStudio.NET 2010,(C#),在XP SP2上测试通过。如果有任何问题的话,请各位大侠多多指教。

    展开全文
    qq798833488 2016-11-16 21:42:47
  • 本文最新版已迁移至:http://holbrook.github.io/emacs_orgmode_task.html Org-mode,最强的任务管理利器,没有之一 程序员对于“TODO”这
    原文地址为:
    Emacs学习笔记(10):Org-mode,最强的任务管理利器,没有之一
    

    本文最新版已迁移至:http://holbrook.github.io/emacs_orgmode_task.html

    Org-mode,最强的任务管理利器,没有之一

    程序员对于“TODO”这个词一定不陌生。一个TODO意味着有一件事情需要去做。更深入一步来说,TODO是一个未完成的任务。

    Org-mode能够完美解决任务管理的各种问题,包括任务/子任务的划分,关键时间的设定,任务状态变化的跟踪,以及任务的检索和查询。 再配合Org-mode的强大编辑功能, 能够实现很多功能,比如时间管理(GTD),项目计划和管理,工作日志等。

    本文介绍Org-mode强大的任务管理功能。

    1 定义任务和子任务

    Org-mode认为,每一个任务通常会需要附带一些文字说明。所以Org-mode将标题作为任务的载体。通过在标题上增加状态标记,来定义任务。 由于大纲是分级的,所以将标题定义为任务天然支持了子任务:可以在子标题上标记子任务。

    使用C-c C-t或者S-LEFT/RIGTH 可以为标题增加或改变任务标记。

    2 定义任务状态

    Org-mode内置的任务状态只有两种:TODO和DONE。如果需要更多的状态,需要自己定义。

    可以在文件内部定义任务状态: 关键字应该各不相同,这样对于一个选项 Org 才知道该用哪个状态序列(集合)。例子中也给出了快速使用一个关键字的方法,就是在关键字后面括号中给出快捷字母——当用 C-c C-t时,会询问,让你输入一个字母。

    要自定义任务状态,可以使用文档元数据“#+SEQTODO:”,可以在文档的任何地方定义,但是建议统一定义在文档头部:

    #+SEQ_TODO: REPORT(r) BUG(b) KNOWNCAUSE(k) | FIXED(f)
    #+SEQ_TODO: TODO(T!) | DONE(D@)3 CANCELED(C@/!)

    将光标放在这些内容上,输入 C-c C-c 可以直接生效。此时再用C-c C-t设定任务时,会打开一个新的缓冲区:

     

    对照前面的定义不难发现:

    • 可以定义多组状态序列,每个“#+SEQTODO”行定义一组
    • 状态之间用空格分隔
    • 可以在()中定义附加选项,包括:
      • 字符:该状态的快捷键
      • !:切换到该状态时会自动增加时间戳
      • @ :切换到该状态时要求输入文字说明
      • 如果同时设定@和!,使用“@/!”
    • 用“|”分隔未完成状态和已完成状态。未完成状态在查询待办事项时会列出。

    使用C-c C-t 或者 S-LEFT/RIGTH 切换一些状态后,任务会变成这个样子:

    会自动生成时间戳,提示填写说明。从而留下完整的记录。

    上面的任务状态设置只适用于当前文档。如果希望设定所有.org文档的默认任务状态,需要在.emacs配置文件中定义。 上面的任务状态在配置文件中的等效设置为:

    (setq org-todo-keywords
    '((sequence "REPORT(r)" "BUG(b)" "KNOWNCAUSE(k)" "|" "FIXED(f)")
    (sequence "TODO(T!)" "|" "DONE(D@)3" "CANCELED(C@/!)")
    ))

    除了状态序列外,还可以定义type,来标记任务的分类。可以参考这里 。

    3 设置任务优先级

    在Org-mode中,还针对任务设定了A,B,C三种优先级,在安排日程的时候可以按照优先级进行排序。为任务设定优先级是通过 快捷键 S-UP/DOWN

    4 跟踪子任务完成情况

    对于有多个子任务的上级任务,很常见的一个需求是随时跟踪子任务的完成情况。 Org-mode支持在上级任务上增加标记,当子任务的状态发生改变时自动更新上级任务的完成情况。 支持百分比和分数两种形式,类似[66%] 或者 [2/3]。

    可以在上级任务标题中的任意位置插入[%] 或者 [/], 当子任务的状态发生变化时,会自动更新该位置的值。 比如:

    * Organize Party [%]
    ** Call people [/]
    *** Peter
    *** Sarah
    ** Buy food
    ** Talk to neighbor

    注意:

    1. 当改变子任务状态时,只更新上一级任务的完成情况,不可级联。
    2. 即使所有的子任务都完成,也只是标记上一级任务的完成情况为100%,而不能自动更新上级任务的完成状态。如果需要自动设定为完成,可以在.emacs中增加如下配置:
        (defun org-summary-todo (n-done n-not-done)
    "Switch entry to DONE when all subentries are done, to TODO otherwise."
    (let (org-log-done org-log-states) ; turn off logging
    (org-todo (if (= n-not-done 0) "DONE" "TODO"))))

    (add-hook 'org-after-todo-statistics-hook 'org-summary-todo)

    5 用复选框标记非标题类型的子任务

    前面的任务和子任务都是标题形式。Org-mode还支持非标题形式的子任务。对于以”[ ]“开头的列表, 会被当作复选框。这样就形成了局部的子任务, 适用于将一个任务划分成几个简单的步骤。 下面是一个例子:

    *** 一个任务 [0/2]
    该任务包含几个步骤:
    - [-] 步骤1 [1/2]
    - [X] 步骤1.1
    - [ ] 步骤1.2
    - [-] 步骤2 [1/2]
    - [X] 步骤2.1
    - [ ] 步骤2.2

    与子任务类似,步骤的状态变化会改变上级步骤/任务的完成情况。 下面是复选框相关的命令:

     
    KEYSCOMMENT
    C-c C-c改变复选框状态
    M-S-RET增加一个子项

    6 查询任务

    Org-mode的编辑功能 中介绍过大纲的检索功能:

    前面 C-c /            只列出包含搜索结果的大纲,并高亮,支持多种搜索方式

    该功能可以按照多种方式检索,其中针对任务有两种方式: todo 和 TODO key words。 分别实现高亮所有TODO和具有特定关键字的TODO

    7 任务的时间计划

    Org-mode中的任务还可以设置计划时间(SCHEDULED)和截止时间(DEADLINE),方便任务的管理和排程。

    7.1 时间戳

    在Org-mode中,将带有日期和时间信息的特定格式的字符串称为时间戳。时间戳使用”< >“进行标记,比如:

    <2005-10-01 Tue>
    <2003-09-16 Tue 09:39>
    <2003-09-16 Tue 12:00-12:30>

    时间戳分为两种,上面的例子中的时间戳都标记了一个”时间点“,另外一种时间戳标记重复出现的多个时间点。 使用时间点+ 间隔( 天(d)、周(w)、月(m)或者年(y))来表示。比如:

     <2007-05-16 Wed 12:30 +1w>

    表示从2007-05-16 12:30开始,每周重复一次。

    时间戳可以放在标题或正文的任何部分。

    输入时间戳时,可以手工输入符合格式的标记,也可以使用快捷键 C-c . 来创建。

    如果要快速输入日期无需选择,可以直接用C-c <。

    C-c > 可以查看日历。

    如果仅仅想输入一个日期/时间,与任务没有任何关系,可以用C-c !。

    S-left|S-right 以天为单位调整时间戳时间 S-up|S-down 调整光标所在时间单位;如果光标在时间戳之外,调整时间戳类型(是否在日程表中显示) S-LEFT/ 将光标处理的时间戳改变一天。 RIGHT ─────────────────────────────────────────────────────────────────────────── S-UP/ 改变时间戳中光标下的项。光标可以处在年、月、日、时或者分之上。当时间戳包含一个时间段时,如 “15:30-16:30”,修改第一个时间,会自动同时修改第 DOWN 二个时间,以保持时间段长度不变。想修改时间段长度,可以修改第二个时间。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    时间/日期段

    两个时间戳用‘–’连接起来就定义了一个时间段:

      <2004-08-23 Mon>--<2004-08-26 Thu>

    连续使用C-c . 可以创建时间段

    C-c C-y 计算时间段的间隔

    7.2 计划时间和截止时间

    Org-mode可以为任务设定一个计划时间(SCHEDULED), 输入 C-c C-s,就可以设定光标所在位置所属的任务的计划时间。 而 C-c C-d是输入截止时间(DEADLINE)。

    8 全局任务文件清单

    前面的内容都是关于单个.org文件的任务管理。Org-mode还支持将多个.org文件组合起来进行管理。这带来很多好处:

    你可以按照不同的用途将任务放在不同的文件中进行组织,比如项目,个人事务,家庭等等。

    要让Org-mode知道需要把哪些文件视为全局任务的组成部分,需要设定一个清单,可以在.emacs中这样设置:

    (setq org-agenda-files (list "~/.todos/work.org"
    "~/.todos/projects.org"
    "~/.todos/home.org"
    "~/Documents/todo/"
    ))

    清单中可以加入文件或目录。如果是目录,该目录下的所有.org文件都会被加入清单。

    除了预定义的清单文件,还可以在编辑任务文件(.org)时随时使用C-c [ / ] 将文件加入/移出清单。

    可以随时通过C-c '/, 循环打开所有的清单文件。

    9 全局 TODO 列表

    全局TODO列表列出所有全局任务文件中的未完成任务。通过快捷键 C-c a t 进入全局 TODO 列表。

    在全局TODO列表中,用 t 键改变任务状态,;按 RET 跳到该条目所在的源文件。

    如果提示C-c a快捷键未定义,是因为Org-mode的快捷键没有启用,需要在.emacs中增加配置:

    (global-set-key "\C-cl" 'org-store-link)
    (global-set-key "\C-cc" 'org-capture)
    (global-set-key "\C-ca" 'org-agenda)
    (global-set-key "\C-cb" 'org-iswitchb)

    10 日程表

    有时候可能需要根据未完成任务显示日程安排,通过 C-c a a 可以进入日程表视图。 日程表根据任务的计划时间列出每天的任务。

    在日程表视图中按 "l"(小写字母L) 显示日志。这样就会显示你所有已经完成的任务和他们完成的时间。

    11 小结

    这里涉及到的都是关于Org-mode任务管理的一些基本使用,正是这些强有力的基础,使得Org-mode可以用于时间管理(GTD)、项目计划和管理、 工作日志等各种用途。


    Date: 2012-04-14 22:06:40 CST

    Author: Holbrook

    Org version 7.8.08 with Emacs version 23

    Validate XHTML 1.0

    转载请注明本文地址: Emacs学习笔记(10):Org-mode,最强的任务管理利器,没有之一
    展开全文
    wangchaoqi1985 2018-08-18 12:42:49
  • einsteinz 2011-09-07 12:08:52
  • X8i0Bev 2019-09-04 22:22:30
  • youyu_torch 2016-07-24 21:04:08
  • weixin_42611900 2018-09-07 23:29:28
  • zwqjoy 2019-06-11 14:24:26
  • imJaron 2017-09-12 14:18:00
  • ab748998806 2016-04-18 20:50:00
  • liangpei2008 2014-03-13 17:09:23
  • cashcat2004 2015-04-13 22:38:39
  • fengyeNom1 2019-05-17 11:24:10
  • weixin_39934520 2018-12-06 22:10:07
  • makebuaa 2013-06-29 21:28:13
  • qq_41798754 2019-06-12 21:58:46
  • xc_zhou 2018-10-12 18:59:31
  • 5星
    46.9MB yjt1448 2016-10-23 17:32:05
  • lsqingfeng 2020-09-01 16:02:14
  • yanghua_kobe 2016-04-23 22:07:55
  • wenzhu2333 2020-02-05 22:33:54
  • colorant 2017-11-30 09:49:09
  • techexcel123 2012-02-08 16:07:18
  • Dream_Weave 2019-05-24 22:03:56
  • a49220824 2018-06-30 19:02:50
  • zhouwang907680720 2019-05-22 22:54:50
  • LJJZJ 2019-10-15 20:13:55
  • Listron 2019-01-03 10:52:37
  • zaishuiyifangxym 2019-04-20 11:59:56

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 135,329
精华内容 54,131
关键字:

怎么强开任务管理器