通过热键HotKey关闭正在运行的某个进程

本文介绍了一个使用C++实现的程序,该程序能够通过注册热键来触发特定进程的查找与终止操作。主要功能包括:使用热键启动程序,通过进程名查找进程并获取PID,以及终止指定PID的进程。程序中包含了进程操作和热键监听的详细实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <Windows.h>
#include<chrono>

#include <tlhelp32.h>
#include <tchar.h>
#include <ShellAPI.h>
#include <iostream>
#include <string>
#include <tchar.h>

bool FindProcess(std::string strProcessName, DWORD& dwPid)
{
	std::wstring wstr = StringToWstring(strProcessName);
	TCHAR tszProcess[64] = { 0 };
	//lstrcpy(tszProcess, wstr.c_str());
	lstrcpy(tszProcess, strProcessName.c_str());
	//查找进程
	STARTUPINFO st;
	PROCESS_INFORMATION pi;
	PROCESSENTRY32 ps;
	HANDLE hSnapshot;
	memset(&st, 0, sizeof(STARTUPINFO));
	st.cb = sizeof(STARTUPINFO);
	memset(&ps, 0, sizeof(PROCESSENTRY32));
	ps.dwSize = sizeof(PROCESSENTRY32);
	memset(&pi, 0, sizeof(PROCESS_INFORMATION));
	// 遍历进程 
	hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (hSnapshot == INVALID_HANDLE_VALUE)
		return false;
	if (!Process32First(hSnapshot, &ps))
		return false;
	do {
		if (lstrcmp(ps.szExeFile, tszProcess) == 0)
		{
			//找到制定的程序
			dwPid = ps.th32ProcessID;
			CloseHandle(hSnapshot);
			//printf("找到进程: %s\n", tszProcess);
			return true;
			//getchar();
			//return dwPid;
		}
	} while (Process32Next(hSnapshot, &ps));
	CloseHandle(hSnapshot);
	return false;
}
bool KillProcess(DWORD dwPid)
{
	printf("Kill进程Pid = %d\n", dwPid);
	//关闭进程
	HANDLE killHandle = OpenProcess(PROCESS_TERMINATE | PROCESS_QUERY_INFORMATION |   // Required by Alpha
		PROCESS_CREATE_THREAD |   // For CreateRemoteThread
		PROCESS_VM_OPERATION |   // For VirtualAllocEx/VirtualFreeEx
		PROCESS_VM_WRITE,             // For WriteProcessMemory);
		FALSE, dwPid);
	if (killHandle == NULL)
		return false;
	TerminateProcess(killHandle, 0);
	return true;
}
void EnableDebugPriv()
{
	HANDLE hToken;
	TOKEN_PRIVILEGES tkp;
	OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
	LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
	tkp.PrivilegeCount = 1;
	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
	AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, NULL);
	CloseHandle(hToken);
}


int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	MSG msg;
	if (!RegisterHotKey(NULL, 0, MOD_CONTROL | MOD_SHIFT, 'Q')) {//热键 ALT该下参数
		return -1;//注册热键失败
	}
	if (!RegisterHotKey(NULL, 1, MOD_CONTROL | MOD_SHIFT, 'E')) {
		return -1;//注册热键失败
	}
	while (GetMessage(&msg, NULL, 0, 0)) {
		if (msg.message == WM_HOTKEY) {
			if (msg.wParam == 0)
			{
				//打开文件

				std::string str_exe_name = "notepad.exe";
				DWORD dwPid = 0;
				EnableDebugPriv();
				FindProcess(str_exe_name, dwPid);

				KillProcess(dwPid);
				Sleep(2000);
				if (dwPid != 0)
				{
					break;
				}
				
				
			}
			else {
				break;
			}
		}
	}
	return 0;
}

 

import keyboard import subprocess import os import sys import time import threading from queue import Queue # 配置参数 HOTKEY = "ctrl+alt+shift+p" # 自定义组合键 SCRIPTS = [ # 要顺序执行的脚本列表 r"G:\Procharm练习\读取剪贴板.py", r"G:\Procharm练习\顺序号新.py", ] # 全局状态管理 class ScriptRunner: def __init__(self): self.output_queue = Queue() self.is_running = False self.last_run_time = 0 self.cooldown = 3 # 秒,防止重复触发 def run_script(self, script_path): """执行单个脚本并捕获输出""" script_name = os.path.basename(script_path) self.output_queue.put(f"\n🚀 开始执行: {script_name}") try: # 创建子进程 process = subprocess.Popen( [sys.executable, script_path], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, encoding='utf-8', errors='replace', creationflags=subprocess.CREATE_NO_WINDOW # Windows无窗口运行 ) # 实时读取输出 while True: line = process.stdout.readline() if not line: break self.output_queue.put(f"[{script_name}] {line.rstrip()}") # 检查退出状态 return_code = process.wait() if return_code == 0: self.output_queue.put(f"✅ {script_name} 执行成功") else: self.output_queue.put(f"❌ {script_name} 执行失败 (代码: {return_code})") return return_code except Exception as e: self.output_queue.put(f"🔥 {script_name} 启动失败: {str(e)}") return 1 def execute_sequence(self): """按顺序执行所有脚本""" if self.is_running: self.output_queue.put("⚠️ 脚本正在运行中,请等待完成") return current_time = time.time() if current_time - self.last_run_time < self.cooldown: self.output_queue.put(f"⏳ 冷却中,请 {self.cooldown - int(current_time - self.last_run_time)} 秒后再试") return self.is_running = True self.last_run_time = current_time # 在后台启动执行线程 threading.Thread(target=self._run_scripts, daemon=True).start() def _run_scripts(self): """实际执行脚本的线程函数""" start_time = time.time() self.output_queue.put(f"\n{'=' * 50}") self.output_queue.put(f"🎯 触发快捷键 {HOTKEY}") self.output_queue.put(f"⏱️ 开始时间: {time.strftime('%H:%M:%S')}") self.output_queue.put('=' * 50) # 顺序执行所有脚本 all_success = True for script in SCRIPTS: exit_code = self.run_script(script) if exit_code != 0: all_success = False break # 任一脚本失败则终止后续执行 # 显示最终结果 elapsed = time.time() - start_time if all_success: self.output_queue.put(f"\n🏁 所有脚本执行成功! 用时: {elapsed:.1f}秒") else: self.output_queue.put(f"\n⚠️ 脚本执行中断! 用时: {elapsed:.1f}秒") self.is_running = False def print_output(self): """打印所有队列中的输出""" while not self.output_queue.empty(): print(self.output_queue.get()) def register_hotkey(self): """注册全局快捷键并启动主循环""" keyboard.add_hotkey(HOTKEY, self.execute_sequence) print(f"⌨️ 全局快捷键已注册: {HOTKEY}") print("⏳ 监听中... (按 ESC 退出)") # 主循环:处理输出和退出 try: while True: self.print_output() if keyboard.is_pressed('esc'): print("\n🔚 用户退出") break time.sleep(0.1) # 减少CPU占用 finally: keyboard.unhook_all_hotkeys() if __name__ == "__main__": runner = ScriptRunner() runner.register_hotkey() 这个代码只能运行一次
最新发布
07-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值