半肾
精华
|
战斗力 鹅
|
回帖 0
注册时间 2009-1-26
|
本帖最后由 eggplant 于 2025-8-7 18:13 编辑
有没有能一键恢复关机之前打开的程序的软件
简单粗糙的研究了一下,最开始以为应该用Win32 API什么的,但是 EnumWindows 枚举出来的窗口并不是用户任务栏级别的。
所以搜了一下,找到一个C#的,本来找到个C++,因为用的老电脑Win7,不行,这个C#的可以,所以想想Win7能过,高版本Windows应该也不是问题。
参考地址
https://ourcodeworld.com/article ... -csharp-in-winforms
例子C#命令行下就能编译通过,然后你需要自己再显示个程序路径
- Console.WriteLine(" PATH : {0}", process.MainModule.FileName);
复制代码
然后这个程序会列出自己,也就是程序本身的名字,自己写点代码排除一下就行,或者简单点,忽略最后一个结果就行。
因为例子非常简单,就几行代码,所以你可以拿Winform或者什么的再批量处理一下,加个按钮和点击启动什么的。批量全启动可能并不是个好主意,你想干也不是不行。
贴个Winform代码,默认新建Winform,编译时需要指定为x64,因为默认可能x86,32位读不了64位。Win7,VS2017下通过。
新建两个Button控件,button1保存,button2重启
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using System.IO;
- using System.Diagnostics;
- namespace RestartAppPath
- {
- public partial class Form1 : Form
- {
- public string saveFileName = "appList.txt";
- public void WritePath()
- {
- Process[] processlist = Process.GetProcesses();
- List<string> paths = new List<string>();
- List<string> passList = new List<string>();
- //忽略Visual Studio编辑器,如果你用其他编辑器,比如VS Code自己测试加入
- passList.Add("devenv");
- //忽略VS命令行Debug测试运行窗口
- passList.Add("VsDebugConsole");
- //忽略程序自己
- passList.Add(Process.GetCurrentProcess().ProcessName);
- for (int i = 0; i < processlist.Length; i++)
- {
- if (!String.IsNullOrEmpty(processlist[i].MainWindowTitle))
- {
- bool bShouldAdd = true;
- for (int j = 0; j < passList.Count; j++)
- {
- //过滤忽略列表字符串
- if (passList[j] == processlist[i].ProcessName)
- {
- bShouldAdd = false;
- break;
- }
- }
- if (bShouldAdd)
- {
- paths.Add(processlist[i].MainModule.FileName);
- }
- }
- }
- FileStream out_fs = File.Open(saveFileName, FileMode.Create);
- StreamWriter sw = new StreamWriter(out_fs);
- for (int i = 0; i < paths.Count; i++)
- {
- sw.WriteLine(paths[i]);
- }
- sw.Flush();
- sw.Close();
- out_fs.Close();
- }
- public void StartPath()
- {
- if(File.Exists(saveFileName))
- {
- string[] lines = File.ReadAllLines(saveFileName);
- for (int i = 0; i < lines.Length; i++)
- {
- Process.Start(lines[i]);
- }
- }
- }
- public Form1()
- {
- InitializeComponent();
- }
- private void button1_Click(object sender, EventArgs e)
- {
- WritePath();
- }
- private void button2_Click(object sender, EventArgs e)
- {
- StartPath();
- }
- }
- }
复制代码
原理
1.保存当前所有程序路径到appList.txt文件,每行1个路径
2.读取每行文本,批量启动
有被扫描进去的,但是又不想重启的路径,自己删除文本文件中那一行就行,比如音乐播放器之类的。
|
|