123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- using GeekDesk.Constant;
- using GeekDesk.MyThread;
- using GeekDesk.ViewModel;
- using HandyControl.Controls;
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.IO;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows;
- namespace GeekDesk.Util
- {
- public class ProcessUtil
- {
- public static void StartIconApp(IconInfo icon, IconStartType type, bool useRelativePath = false)
- {
- App.Current.Dispatcher.Invoke(() =>
- {
- try
- {
- using (Process p = new Process())
- {
- string startArg = icon.StartArg;
- if (startArg != null && Constants.SYSTEM_ICONS.ContainsKey(startArg))
- {
- StartSystemApp(startArg, type);
- }
- else
- {
- string path;
- if (useRelativePath)
- {
- string fullPath = Path.Combine(Constants.APP_DIR, icon.RelativePath);
- path = Path.GetFullPath(fullPath);
- }
- else
- {
- path = icon.Path;
- }
- p.StartInfo.FileName = path;
- if (!StringUtil.IsEmpty(startArg))
- {
- p.StartInfo.Arguments = startArg;
- }
- if (icon.IconType == IconType.OTHER)
- {
- if (!File.Exists(path) && !Directory.Exists(path))
- {
- //如果没有使用相对路径 那么使用相对路径启动一次
- if (!useRelativePath)
- {
- StartIconApp(icon, type, true);
- return;
- }
- else
- {
- HandyControl.Controls.Growl.WarningGlobal("程序启动失败(文件路径不存在或已删除)!");
- return;
- }
- }
- p.StartInfo.WorkingDirectory = path.Substring(0, path.LastIndexOf("\\"));
- switch (type)
- {
- case IconStartType.ADMIN_STARTUP:
- //p.StartInfo.Arguments = "1";//启动参数
- p.StartInfo.Verb = "runas";
- //p.StartInfo.CreateNoWindow = false; //设置显示窗口
- p.StartInfo.UseShellExecute = true;//不使用操作系统外壳程序启动进程
- //p.StartInfo.ErrorDialog = false;
- if (MainWindow.appData.AppConfig.AppHideType == AppHideType.START_EXE && !RunTimeStatus.LOCK_APP_PANEL)
- {
- //如果开启了贴边隐藏 则窗体不贴边才隐藏窗口
- if (MainWindow.appData.AppConfig.MarginHide)
- {
- if (!MarginHide.IsMargin())
- {
- MainWindow.HideApp();
- }
- }
- else
- {
- MainWindow.HideApp();
- }
- }
- break;// c#好像不能case穿透
- case IconStartType.DEFAULT_STARTUP:
- if (MainWindow.appData.AppConfig.AppHideType == AppHideType.START_EXE && !RunTimeStatus.LOCK_APP_PANEL)
- {
- //如果开启了贴边隐藏 则窗体不贴边才隐藏窗口
- if (MainWindow.appData.AppConfig.MarginHide)
- {
- if (!MarginHide.IsMargin())
- {
- MainWindow.HideApp();
- }
- }
- else
- {
- MainWindow.HideApp();
- }
- }
- break;
- case IconStartType.SHOW_IN_EXPLORE:
- p.StartInfo.FileName = "Explorer.exe";
- p.StartInfo.Arguments = "/e,/select," + icon.Path;
- break;
- }
- }
- else
- {
- if (MainWindow.appData.AppConfig.AppHideType == AppHideType.START_EXE && !RunTimeStatus.LOCK_APP_PANEL)
- {
- //如果开启了贴边隐藏 则窗体不贴边才隐藏窗口
- if (MainWindow.appData.AppConfig.MarginHide)
- {
- if (!MarginHide.IS_HIDE)
- {
- MainWindow.HideApp();
- }
- }
- else
- {
- MainWindow.HideApp();
- }
- }
- }
- p.Start();
- if (useRelativePath)
- {
- //如果使用相对路径启动成功 那么重新设置程序绝对路径
- icon.Path = path;
- }
- }
- }
- icon.Count++;
- //隐藏搜索框
- if (RunTimeStatus.SEARCH_BOX_SHOW)
- {
- MainWindow.mainWindow.HidedSearchBox();
- }
- }
- catch (Exception e)
- {
- if (!useRelativePath)
- {
- StartIconApp(icon, type, true);
- }
- else
- {
- HandyControl.Controls.Growl.WarningGlobal("程序启动失败(可能为不支持的启动方式)!");
- LogUtil.WriteErrorLog(e, "程序启动失败:path=" + icon.Path + ",type=" + type);
- }
- }
- });
- }
- private static void StartSystemApp(string startArg, IconStartType type)
- {
- if (type == IconStartType.SHOW_IN_EXPLORE)
- {
- Growl.WarningGlobal("系统项目不支持打开文件位置操作!");
- return;
- }
- switch (startArg)
- {
- case "Calculator":
- Process.Start("calc.exe");
- break;
- case "Computer":
- Process.Start("explorer.exe");
- break;
- case "GroupPolicy":
- Process.Start("gpedit.msc");
- break;
- case "Notepad":
- Process.Start("notepad");
- break;
- case "Network":
- Process.Start("ncpa.cpl");
- break;
- case "RecycleBin":
- Process.Start("shell:RecycleBinFolder");
- break;
- case "Registry":
- Process.Start("regedit.exe");
- break;
- case "Mstsc":
- if (type == IconStartType.ADMIN_STARTUP)
- {
- Process.Start("mstsc", "-admin");
- }
- else
- {
- Process.Start("mstsc");
- }
- break;
- case "Control":
- Process.Start("Control");
- break;
- case "CMD":
- if (type == IconStartType.ADMIN_STARTUP)
- {
- using (Process process = new Process())
- {
- process.StartInfo.FileName = "cmd.exe";
- process.StartInfo.Verb = "runas";
- process.Start();
- }
- }
- else
- {
- Process.Start("cmd");
- }
- break;
- case "Services":
- Process.Start("services.msc");
- break;
- }
- //如果开启了贴边隐藏 则窗体不贴边才隐藏窗口
- if (MainWindow.appData.AppConfig.MarginHide)
- {
- if (!MarginHide.IS_HIDE)
- {
- MainWindow.HideApp();
- }
- }
- else
- {
- MainWindow.HideApp();
- }
- }
- public static void ReStartApp()
- {
- if (MainWindow.appData.AppConfig.MouseMiddleShow || MainWindow.appData.AppConfig.SecondsWindow == true)
- {
- MouseHookThread.Dispose();
- }
- Process p = new Process();
- p.StartInfo.FileName = Constants.APP_DIR + "GeekDesk.exe";
- p.StartInfo.WorkingDirectory = Constants.APP_DIR;
- p.Start();
- Application.Current.Shutdown();
- }
- [Flags]
- private enum ProcessAccessFlags : uint
- {
- QueryLimitedInformation = 0x00001000
- }
- [DllImport("kernel32.dll", SetLastError = true)]
- private static extern bool QueryFullProcessImageName(
- [In] IntPtr hProcess,
- [In] int dwFlags,
- [Out] StringBuilder lpExeName,
- ref int lpdwSize);
- [DllImport("kernel32.dll", SetLastError = true)]
- private static extern IntPtr OpenProcess(
- ProcessAccessFlags processAccess,
- bool bInheritHandle,
- int processId);
- public static String GetProcessFilename(Process p)
- {
- int capacity = 2000;
- StringBuilder builder = new StringBuilder(capacity);
- IntPtr ptr = OpenProcess(ProcessAccessFlags.QueryLimitedInformation, false, p.Id);
- if (!QueryFullProcessImageName(ptr, 0, builder, ref capacity))
- {
- return String.Empty;
- }
- return builder.ToString();
- }
- }
- }
|