1. 程式人生 > >如何通過程序名字關閉系統正在執行的程序

如何通過程序名字關閉系統正在執行的程序

STEP ONE

終止正在執行的程序,我們用TerminateProcess()函式,函式原型:

BOOL TerminateProcess(
  HANDLE hProcess, // handle to the process
  UINT uExitCode   // exit code for the process
);

So,在這兒,我們需要獲得需要終止的程序的控制代碼。

STEP TWO

因此,我們想到函式OpenProcess(),函式原型:

HANDLE OpenProcess(
  DWORD dwDesiredAccess,  // access flag
  BOOL bInheritHandle
, // handle inheritance flag DWORD dwProcessId // process identifier );
這樣,問題轉到獲取程序ID。

STEP THREE

用CreateToolhelp32Snapshot()函式獲得程序切片,然後通過函式Process32First()和Process32Next()依次獲得程序資訊(包括程序名和程序ID)。

各函式原型如下:

HANDLE WINAPI CreateToolhelp32Snapshot(
  DWORD dwFlags,       
  DWORD th32ProcessID  
);
BOOL WINAPI Process32First(
  HANDLE hSnapshot,      
  LPPROCESSENTRY32 lppe  
);
BOOL WINAPI Process32Next(
  HANDLE hSnapshot,      
  LPPROCESSENTRY32 lppe  
);
解釋:

CreateToolhelp32Snapshot函式為指定的程序、程序使用的堆[HEAP]、模組[MODULE]、執行緒[THREAD])建立一個快照[snapshot]。
  引數:
  dwFlags
  [輸入]指定快照中包含的系統內容,這個引數能夠使用下列數值(常量)中的一個或多個。
  TH32CS_INHERIT - 宣告快照控制代碼是可繼承的。
  TH32CS_SNAPALL - 在快照中包含系統中所有的程序和執行緒。
  TH32CS_SNAPHEAPLIST - 在快照中包含在th32ProcessID中指定的程序的所有的堆。
  TH32CS_SNAPMODULE - 在快照中包含在th32ProcessID中指定的程序的所有的模組。
  TH32CS_SNAPPROCESS - 在快照中包含系統中所有的程序。
  TH32CS_SNAPTHREAD - 在快照中包含系統中所有的執行緒。
  Const TH32CS_SNAPHEAPLIST = &H1
  Const TH32CS_SNAPPROCESS = &H2
  Const TH32CS_SNAPTHREAD = &H4
  Const TH32CS_SNAPMODULE = &H8
  Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE)
  Const TH32CS_INHERIT = &H80000000
  th32ProcessID
  [輸入]指定將要快照的程序ID。如果該引數為0表示快照當前程序。該引數只有在設定了TH32CS_SNAPHEAPLIST或者TH32CS_SNAPMODULE後才有效,在其他情況下該引數被忽略,所有的程序都會被快照。
  返回值:
  呼叫成功,返回快照的控制代碼,呼叫失敗,返回INVALID_HANDLE_VALUE 。

STEP FOUR

具體實現程式碼(附詳細註釋):

#include "stdafx.h"




#include <iostream>
#include <Tlhelp32.h>

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);  //獲取程序切片
    if (hProcessSnap == INVALID_HANDLE_VALUE)
    {
        std::cout << "獲取系統程序切片失敗" << std::endl;
        return 1;
    }

    PROCESSENTRY32 pe32 = { sizeof(pe32) }; //儲存程序切片的臨時變數

    if (!Process32First(hProcessSnap, &pe32))   //獲取第一個程序切片
    {
        std::cout<<"獲取切片程序失敗"<<std::endl;
    }

    int i = 0;//程序計數

    do    //依次獲取程序切片
    { 
        ++i;

        char name[100] = {0};   //列印程序名
        sprintf_s(name, "%d: %S",i, pe32.szExeFile);
        std::cout << name << std::endl;

        //找到Win32Project1.exe後,獲取控制代碼,終止程序
        if (0==_tcscmp(pe32.szExeFile,TEXT("Win32Project1.exe")))
        { 
            HANDLE hGUI = OpenProcess(PROCESS_ALL_ACCESS, true, pe32.th32ProcessID);
            if (NULL == hGUI)
            {
                std::cout << "獲取程序控制代碼失敗" << std::endl;
                return 1;
            }
            TerminateProcess(hGUI, 0);  //終止程序
        }

    } while (Process32Next(hProcessSnap, &pe32));

	return 0;
}

另外一種有效的方法:

相關推薦

如何通過程序名字關閉系統正在執行程序

STEP ONE 終止正在執行的程序,我們用TerminateProcess()函式,函式原型: BOOL TerminateProcess( HANDLE hProcess, // handle to the process UINT uExitCode /

獲取windows系統所有執行程序

#include <TlHelp32.h> 包含此標頭檔案 bool traverseProcesses(map<string, int>& _nameID) { PROCESSENTRY32 pe32; pe

Linux根據程序名字關閉Java程序

jps | grep RunJar  :是獲取程序名字為RunJar的java程序,輸出資訊為: [[email protected] ~]$  9564 RunJar jps | gr

java程序在windows系統作為服務程序運行

系統啟動 選擇 器) 啟動腳本 copy iso 感覺 net socket Java程序很多情況下是作為服務程序運行的,在Un*x 平臺下可以利用在命令後加“&”把程序作為後臺服務運行,但在Windows下看作那個Console窗口在桌面上,你是否一直擔心別的同時

java程序在windows系統作為服務程序運行(轉)

ron eclipse bat文件 you block htm sdk 分享圖片 hpux Java程序很多情況下是作為服務程序運行的,在Un*x 平臺下可以利用在命令後加“&”把程序作為後臺服務運行,但在Windows下看作那個Console窗口在桌面上

windows系統查詢指定埠執行程序關閉

假如佔用的埠是80: 先開啟cmd命令視窗 再查詢80端口占用的程序:netstat  -aon|findstr  "80"    ,找到對應的程式的PID號: 根據PID號找到對應的程序:tasklist|findstr "3976"    結束該程序:taskkill /f /t /i

通過C語言HelloWord程序對計算系統理解

lin 數據並行 stdio.h 設備 相對 () 根據 malloc 並行 HelloWord程序C語言代碼 #include<stdio.h> void main(){   printf("HelloWord\n"); } 要了解一個helleword程序的

C 程序實現密碼隱秘輸入 linux系統執行

用戶輸入 tdi code mar main ltr const 鍵盤輸入 dir 讀寫用戶輸入,屏幕不回顯 char *getpass( const char *prompt); getpass用於從鍵盤讀取用戶輸入,但屏幕不回顯。 參數prompt為屏幕提示字

OpenSUSE Leap 42.3下通過Firefox Opera Chromium瀏覽器直接執行java應用程序(打開java jnlp文件)實現在服務器遠程虛擬控制臺完成遠程管理的方法

build 自定義 1.8 jnl use 信息 server run java應用 遠程虛擬控制臺依賴於java運行環境(jre),在通過瀏覽器打開鏈接前,系統必須安裝jre環境,遠程管理控制臺其實就是一個java程序,打開相應的網站會下載一個jnlp(java網絡加

【Linux系統學習】程序執行

程序執行新程式 程序等待 wait()函式 程序執行新程式 fork()/exec()組合是典型的Linux

golang 通過exec Command啟動的程序如何關閉的解決辦法

在用exec包呼叫的其他程序後如何關閉結束,可以使用context包的機制進行管理,context包的使用詳見:https://godoc.org/context   exec.CommandContext方發實現了context,通過context可以對exec啟動的程序結束。

驅動程式設計獲取系統正在執行程序

直接貼程式碼了,在VS2010上面執行通過,記得用Dbgview檢視輸出 #include "ntddk.h" #define SYSTEMPROCESSINFORMATION 5 //處理程序資訊,需要用到這兩個結構體 typedef struct _SYSTEM_THREADS {

淺談程式設計中的執行緒、程序、分散式系統

單執行緒與多執行緒的比較:         單執行緒就是我們學習程式設計時最開始接觸的,比如寫一個"hello world"。而在多執行緒中,其共享code、data、files,同時,它們有各自的registers和stack。         簡單地說,多執

Unity 通過程序關閉外部程式

using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Runtime.

Linux系統網路程式設計中TCP通訊socket--send導致程序關閉

send(sockfd, buff, sizeof(buff), 0); 在linuxTCP通訊中上述send形式是常用的設定方式,但是如果在TCP連結斷開後呼叫該send函式,多次即會導致程序結束。 解決方法 最簡單的方式就是 send(sockfd, buff, sizeo

linux下如何部署(執行)java jar包,並關閉此jar的程序

前段時間剛剛接觸了一下linux系統,本人表示第一次使用無從下手,不像windows作業系統是視覺化的,簡單的建立檔案或資料夾都要通過寫命令才能將其完成,由於工作需要,不得不自學linux ,先是自學常用的一些命令,然後再部署可執行jar,以下是具體的操作步驟。 1、執行

執行緒程式設計程式關閉了,但程序還在的解決方案

自己編的一個串列埠程式,從串列埠除錯助手中讀取資料,採用非同步方式,需要用到多執行緒程式設計, 但是每次執行程式,關閉程式時,開啟程序列表,發現程序還在,導致每次串列埠傳送資料過來時,都先要去手動結束程序, 找了很多方法,發現不會用, 下面是一個很簡單的方法,也很管用: 在

多核處理器&類UNIX系統 -> 之多程序和多執行緒效能比較

網路上有很多討論關於在*NIX系統在SMP環境下到底是應該用多執行緒還是多程序, 到底哪一個有更好的效能,  比如有很多人認為考慮到linux使用1-1執行緒模型(對核心來說, 執行緒就是一個程序)並且系統已經為程序處理做了很多優化,效率提升, 所以在liunx SMP環

cmd 檢視/關閉系統程序

最近用本本老是有幾個本本的程序在登錄檔中找不到自啟動項,今天一想,乾脆在dos下幹掉算了,只不過每次開機都得奸它一次,沒辦法,誰叫它這麼賤呢,自啟動都找不到取消的辦法。 下面咱就幹掉它。 =====================================  ====

作業系統與系統程式設計(二)程序執行

(二)程序與執行緒 1.關於程序: ​ ——程序在使用者方面,包含了程式的執行狀態和這個程式所用的抽象記憶體及儲存資料。 ​ ——程序在作業系統方面:包括: ​ (1)一個程序的執行狀態(通過在程序中儲存”狀態暫存器、指令計數器、棧指標、通用暫存器“等代表程序目