C++ 自动重启程序

#include <QCoreApplication>
#include <QObject>
#include <QTimer>
#include <QString>
#include <iostream>
#include <windows.h>
#include <tlhelp32.h>

QString fullname;

void check_and_restart(){
    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof(pe32);

    HANDLE snap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if (snap == INVALID_HANDLE_VALUE){
        std::cout << "CreateToolhelp32Snapshot failed." << std::endl;
        return;
    }

    BOOL more = ::Process32First(snap,&pe32);
    bool exists = false;
    QString name = fullname.mid(fullname.lastIndexOf('\\'));
    while (more){
        if (name.compare(QString::fromWCharArray(pe32.szExeFile)) == 0){
            exists = true;
            HWND hwnd = ::FindWindow(NULL, name.toStdWString().c_str());
            if (hwnd != NULL){
                HINSTANCE hdll = ::LoadLibrary(L"user32.dll");
                if (NULL != hdll){
                    typedef BOOL(WINAPI *PROCISHUNGAPPWINDOW)(HWND);
                    PROCISHUNGAPPWINDOW IsHungAppWindow = (PROCISHUNGAPPWINDOW)GetProcAddress(hdll, "IsHungAppWindow");
                    if (IsHungAppWindow(hwnd)){
                        //kill and restart
                        HANDLE proc = OpenProcess(PROCESS_ALL_ACCESS,TRUE,pe32.th32ProcessID);
                        TerminateProcess(proc,0);
                        ::CloseHandle(proc);
                        goto restart;
                    }
                }
            }
            ::CloseHandle(snap);
            return;
        }
        more = ::Process32Next(snap,&pe32);
    }
    ::CloseHandle(snap);

    //restart
    if (!exists){
        goto restart;
    }
restart:
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = TRUE;
    if (CreateProcess(fullname.toStdWString().c_str(),NULL,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi)){
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
    }
}

int main(int argc, char *argv[]){
    QCoreApplication a(argc, argv);
    if (argc < 2){
        std::cout << "wrong arguments." << std::endl;
    }
    fullname = QString(argv[1]);
    QTimer timer;
    QObject::connect(&timer, &QTimer::timeout, check_and_restart);
    timer.start(1000);
    return a.exec();
}

  

posted on 2014-02-17 22:56  leon.li  阅读(3748)  评论(0编辑  收藏  举报

导航