C#怎么判断程序是否正确启动 ?

runerback 2015-07-25 09:55:22
通过遍历硬盘寻找指定的程序,比如 a.exe,
我是根据名字找的,所以找到后想通过 Process.Start 来启动然后测试是不是找到了正确的那个程序。
说得明白点,我在找的是一个游戏的主程序,所以如果缺少某个文件就无法正确运行,而这个程序现在被复制到了硬盘中的其他位置,所以会出现无法正确打开的情况,由此来判断找到的路径是 “真的”还是“假的”。但是又不想看到那个错误提示的弹窗“缺少xxx文件”,所以想知道,怎么提供一种类似调试模式来运行,并判断是否正确启动,一旦正确启动就马上关掉,求思路啊。。WinAPI也行的

对应代码:

try
{
FileInfo[] files = info.GetFiles("*.exe");
var result = files.Where(file => file.Name == "OFDR.exe").Select(file => file).ToList();
if (result.Count > 0)
{
foreach (FileInfo _fi in result)
{
try
{
Process _p = Process.Start(_fi.FullName);
if (_p.StandardError == null)
{//这里错的,需要重定向,请无视。。
_p.Kill();
Console.WriteLine("Find In: {0}.", result[0].FullName);
_sentry = true;
loopstate.Stop();
return;
}
else
{
_p.Kill();
}
}
catch { }
}
}
}
catch { }


...全文
291 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
runerback 2015-07-26
  • 打赏
  • 举报
回复
解决了 上代码:

        private static bool _sentry = false;

        private static void GetAllFiles(DirectoryInfo info, ParallelLoopState loopstate)
        {
            if (_sentry == false)
            {
                Console.WriteLine(info.FullName);
                try
                {
                    //所有的隐藏文件都出来了,应该事先记录一下,结束了再改回去
                    info.Attributes = info.Attributes & ~FileAttributes.ReadOnly & ~FileAttributes.Hidden;
                }
                catch { }
                try
                {
                    FileInfo[] files = info.GetFiles("*.exe");
                    var result = files.Where(file => file.Name == "OFDR.exe").ToList();
                    if (result.Count > 0)
                    {
                        foreach (FileInfo _fi in result)
                        {
                            Task.Factory.StartNew(() => { CheckResult(_fi.FullName, loopstate); });
                        }
                    }
                }
                catch { }
                try
                {
                    DirectoryInfo[] infos = info.GetDirectories();
                    if (infos.Length > 0)
                    {
                        try
                        {
                            Parallel.ForEach(infos, _info =>
                            {
                                GetAllFiles(_info, loopstate);
                            });
                        }
                        catch (IOException ex) { Console.WriteLine(ex.Message); }
                    }
                }
                catch { }
            }
        }

        private static void CheckResult(string fullPath, ParallelLoopState _state)
        {
            bool retValue;
            string CommandLine = "";

            PROCESS_INFORMATION pInfo = new PROCESS_INFORMATION();

            STARTUPINFO sInfo = new STARTUPINFO();
            sInfo.cb = Marshal.SizeOf(sInfo);
            sInfo.dwFlags = (int)dwFlags.STARTF_USESHOWWINDOW;
            sInfo.wShowWindow = (short)nCmdShow.SW_HIDE;

            SECURITY_ATTRIBUTES pSec = new SECURITY_ATTRIBUTES();
            SECURITY_ATTRIBUTES tSec = new SECURITY_ATTRIBUTES();
            pSec.nLength = Marshal.SizeOf(pSec);
            tSec.nLength = Marshal.SizeOf(tSec);

            retValue = WinAPI.CreateProcess(
                fullPath,
                CommandLine,
                ref pSec,
                ref tSec,
                false,
                (uint)PriorityClass.NORMAL_PRIORITY_CLASS,
                IntPtr.Zero,
                null,
                ref sInfo,
                out pInfo);

            int error = Marshal.GetLastWin32Error();

            WinAPI.TerminateProcess(pInfo.hProcess, 0);
            if (error != 0)
            {
                //throw new Win32Exception(error);
            }
            else
            {
                _sentry = true;
                _state.Stop();
                Console.WriteLine("Find In: {0}.", fullPath);
            }
        }
结贴。
runerback 2015-07-25
  • 打赏
  • 举报
回复
类似这种: 要用FindWindow或者FindWindowEx? 另外有个问题就是为什么 Process.Kill() 并没有生效,去掉 WaitForExit() 也一样
runerback 2015-07-25
  • 打赏
  • 举报
回复
没有用眼睛判断。。后台处理的 刚才试了下

Process _p = new Process();
_p.StartInfo.UseShellExecute = false;
_p.StartInfo.RedirectStandardError = true;
_p.StartInfo.FileName = _fi.FullName;
_p.Start();
string _error = _p.StandardError.ReadToEnd();
_p.WaitForExit();
_p.Kill();
if (_error == "")
{
	Console.WriteLine("Find In: {0}.", result[0].FullName);
	_sentry = true;
	loopstate.Stop();
}
else {	}
就算出错这里是获取不到的。 要求或者程序流程是,打开程序自动后台搜索游戏主程序位置,找到后才能继续后面的任务。 之前提过问,当时不知道怎么退出递归,也不知道怎么用多线程。 这次用一个全局bool变量来判断并退出递归,用Parallel来多线程遍历并用loopstate退出,然后忽略了系统盘,基本在30秒以内就找到了所有指定名称的程序位置,就差判断真假了 如果这个是和程序本身有关的话,那估计是没戏了,不知道有没有别的办法
  • 打赏
  • 举报
回复
你所谓的“不想看到......”,对于程序来说也就是搜索相应的对话框,判断其是否存在。
无涯大者 2015-07-25
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
请先说清楚,你如何用眼睛判断。如果你要求很多,那么可能做不到。如果你的要求确实可执行,那么才好设计程序。
喜欢这位大哥的说话方式!
  • 打赏
  • 举报
回复
请先说清楚,你如何用眼睛判断。如果你要求很多,那么可能做不到。如果你的要求确实可执行,那么才好设计程序。

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧