IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> window和python查看和调用exe的对照,结合pyqt5应用查找指定程序,并结束应用程序(酒馆战棋整活必备) -> 正文阅读

[开发工具]window和python查看和调用exe的对照,结合pyqt5应用查找指定程序,并结束应用程序(酒馆战棋整活必备)

作者:token keyword

1. 打开程序

对于应用程序而言,可以通过ui界面打开程序,也可以通过命令打开程序。在windows下打开一个应用程序只要输入程序的完成路径即可。在window下打开程序的方式有两种:

  • 双击exe文件打开
  • 通过调用终端命令打开

2. 在终端打开程序和使用python打开程序

在终端打开程序
cd path # 进入指定文件夹
example.exe # 键入程序名称
在python中运行指定的程序
import subprocess
process = subprocess.Popen([r'D:\software\example.exe']) # `D:\software\example.exe` 替代为指定的程序路径即可

3. 在终端查找指定名称程序的pid

对于每个正在运行的程序都有一个pid与之对应,可以通过cmd终端和python两种方式查看

在终端查看
for /f "tokens=2 " %a in ('tasklist  /fi "imagename eq example.exe" /nh') do echo %a # 可以查找所有名为`example.exe` 程序的pid(程序名大小写不敏感)
在python中查看
import subprocess
process = subprocess.run('tasklist  /fi "imagename eq example.exe" /nh', stdout=subprocess.PIPE, encoding='gbk')
print("查询到程序的pid为:", process.stdout)

4. 杀死指定名称的程序

在终端
for /f "tokens=2 " %a in ('tasklist  /fi "imagename eq example.exe" /nh') do taskkill /f /pid %a
在python中
import subprocess
process = subprocess.run('tasklist  /fi "imagename eq example.exe" /nh', stdout=subprocess.PIPE, encoding='gbk')
print("查询到程序的pid为:", process.stdout)
result = re.findall(r'(\d+) Console', process.stdout, re.DOTALL)
print(result)
if result:
	for pid in result:
		output = subprocess.run('taskkill /f /pid %s' % pid, stdout=subprocess.PIPE, encoding='gbk')
print(output.stdout)

应用

检测指定程序是否运行,如果运行则结束应用程序——炉石传说整活插件!!!
在这里插入图片描述
主程序源代码,github项目地址https://gitee.com/sowsophay/battleground.git:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
author: sophay
date: 2021/8/30
"""
import ctypes
import sys
import subprocess
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QSystemTrayIcon, QWidget, QApplication, QAction, QMenu, QGraphicsDropShadowEffect
from interface_ui import Ui_Form
import img_rc


class BWidget(QWidget):
    def __init__(self, *args, **kwargs):
        super(BWidget, self).__init__(*args, **kwargs)
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.SplashScreen)
        self._move_flag = False
        self._mouse_x, self._mouse_y, self._origin_x, self._origin_y = None, None, None, None

    def mousePressEvent(self, evt):
        if evt.button() == Qt.LeftButton:
            self._move_flag = True
            self._mouse_x, self._mouse_y, self._origin_x, self._origin_y = \
                evt.globalX(), evt.globalY(), self.x(), self.y()

    def mouseMoveEvent(self, evt):
        if self._move_flag:
            self.move(self._origin_x + evt.globalX() - self._mouse_x, self._origin_y + evt.globalY() - self._mouse_y)

    def mouseReleaseEvent(self, evt):
        self._move_flag = False


class MainPanel(BWidget, Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.setAttribute(Qt.WA_TranslucentBackground, True)
        self.states = {'battle.net': "", 'Hearthstone': ""}
        self.init_ui()
        qss = """
            #radius_widget {
                background-color: rgb(227, 226, 220);
                border-radius: 10px;
            }
            #close_btn {
                color: black;
                outline: none;
            }
            #close_btn:hover {
                color: darkred;
            }
            #notice_lb {
                color: green;
            }
            #title {
                color: #524f4f;
            }
            #reconnect_btn, #restart_btn {
                border: 1px solid gray;
                border-radius: 5px;
            }
            #reconnect_btn:hover, #restart_btn:hover {
                border: 1px solid #2f3433;
            }
            #reconnect_btn:disabled, #restart_btn:disabled {
                border: none;
            }
            """
        self.setStyleSheet(qss)
        # 添加边缘阴影
        effect = QGraphicsDropShadowEffect(self)
        effect.setBlurRadius(12)
        effect.setOffset(0, 0)
        effect.setColor(Qt.gray)
        self.setGraphicsEffect(effect)
        # 创建系统托盘
        self.system_icon = QIcon(':/logo.ico')
        self.tray_icon = QSystemTrayIcon(self)
        self.create_tray_icon()

    def init_ui(self):
        self.reconnect_btn.clicked.connect(self.reconnect_slot)
        self.restart_btn.clicked.connect(self.restart_slot)
        self.close_btn.clicked.connect(QApplication.instance().quit)

    def reconnect_slot(self):
        self.query_states()
        if all(self.states.values()):
            cmd_cut = 'netsh advfirewall firewall add rule name="酒馆战棋" dir=out program="%s" action=block' % \
                  self.states['Hearthstone']
            cmd_connect = 'netsh advfirewall firewall delete rule name="酒馆战棋"'
            print("断线中")
            self.log("断线中")
            subprocess.run(cmd_cut, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            self.reconnect_btn.setEnabled(False)

            def connect():
                subprocess.run(cmd_connect, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
                               stderr=subprocess.PIPE)
                print("重连成功!")
                self.log("重连成功!")
                self.reconnect_btn.setEnabled(True)

            QTimer.singleShot(3000, connect)

    def restart_slot(self):
        self.query_states()
        if all(self.states.values()):
            p_kill = subprocess.run(
                'taskkill /F /IM "Hearthstone.exe" /T', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
                stderr=subprocess.PIPE, encoding='gbk')
            print("终止程序!", p_kill.stdout)
            self.log("终止炉石传说成功")
            self.restart_btn.setEnabled(False)

            def restart():
                print("重启")
                self.log("正在重启炉石传说")
                cmd = r'%s Launcher.exe --exec="launch WTCG"' % self.states['battle.net'][:-4]
                print(cmd)
                subprocess.run(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
                               stderr=subprocess.PIPE, encoding='gbk')
                self.restart_btn.setEnabled(True)
                self.log("重启成功")

            QTimer.singleShot(5000, restart)

    def query_states(self):
        translate = {'battle.net': '战网', 'Hearthstone': '炉石传说'}
        for name in self.states.keys():
            get_p_path = subprocess.run(
                r'wmic process where name="%s.exe" get executablepath' % name, shell=True, stdin=subprocess.PIPE,
                stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='gbk')
            path = get_p_path.stdout.split('\n')
            if path:
                if "ExecutablePath" in path[0]:
                    path = path[2].strip(' ')
                    print("查询到%s运行路径为:" % translate[name], path)
                    self.states[name] = path
            if not self.states[name]:
                print("请启动%s" % translate[name])
                self.log("请启动%s" % translate[name])
        print(self.states)

    def log(self, msg):
        self.notice_lb.setText("提示:%s" % msg)
        self.notice_lb.adjustSize()

    def create_tray_icon(self):
        restore_menu = QAction('恢复(&R)', self, triggered=self.showNormal)
        quit_menu = QAction('退出(&Q)', self, triggered=QApplication.instance().quit)
        menu = QMenu(self)
        menu.addAction(restore_menu)
        menu.addAction(quit_menu)
        self.tray_icon.setIcon(self.system_icon)
        self.tray_icon.setContextMenu(menu)
        self.tray_icon.show()


if __name__ == '__main__':
    debug = False

    def is_admin():
        try:
            return ctypes.windll.shell32.IsUserAnAdmin()
        except (PermissionError, ValueError):
            return False
    if debug:
        app = QApplication(sys.argv)
        win = MainPanel()
        win.show()
        sys.exit(app.exec_())
    else:
        if is_admin():
            # 将要运行的代码加到这里
            app = QApplication(sys.argv)
            win = MainPanel()
            win.show()
            sys.exit(app.exec_())
        else:
            if sys.version_info[0] == 3:
                ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-11-27 10:06:52  更:2021-11-27 10:09:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 19:35:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码