예제 #1
0
 internal static void MemoryOptimize()
 {
     if (Settings.IsMemoryOptimize)
     {
         MemoryOptimizeTimer.Restart();
     }
     new System.Threading.Thread(() => {
         SendMsg(true, "워크래프트 3 메모리 최적화를 시도합니다.");
         if (CProcess.TrimProcessMemory(TargetProcess, true))
         {
             if (CProcess.MemoryValue[2] < 0)
             {
                 SendMsg(true, "최적화할 메모리를 찾을 수 없었습니다.");
             }
             else
             {
                 SendMsg(true, $"결과: {ConvertSize(CProcess.MemoryValue[0])} - {ConvertSize(CProcess.MemoryValue[2])} = {ConvertSize(CProcess.MemoryValue[1])}");
             }
         }
         else
         {
             SendMsg(true, "Error - 최적화 중에 예외가 발생했습니다.");
         }
     }).Start();
 }
예제 #2
0
        internal static async void ReplayWatcher_Function(object sender, FileSystemEventArgs e)
        {
            if (Settings.IsOptimizeAfterEndGame && await CProcess.TrimProcessMemory() && Settings.IsMemoryOptimize)
            {
                MemoryOptimizeChecker.Restart();
            }
            if (!Settings.IsAutoReplay)
            {
                IsTime = IsSaved = false;
                name   = string.Empty;
                return;
            }
            try
            {
                await Task.Delay(1000);

                MainWorker.ReplayWatcher.EnableRaisingEvents = false;
                string LastReplay = $"{Path.GetDirectoryName(e.FullPath)}\\LastReplay.w3g";
                if (File.Exists(LastReplay) && new FileInfo(LastReplay).Length >= 1024)
                {
                    string FileName;
                    if (IsSaved)
                    {
                        IsSaved = false;
                        string CurrentCategory = $"{DocumentPath}\\Replay\\{Category[0]}\\{Category[1]}";
                        if (!Directory.Exists(CurrentCategory))
                        {
                            Directory.CreateDirectory(CurrentCategory);
                        }
                        FileName = $"{CurrentCategory}\\{(IsTime ? string.Empty : "_")}{name}.w3g";
                        name     = string.Empty;
                        IsTime   = false;
                        if (File.Exists(FileName))
                        {
                            File.Delete(FileName);
                        }
                        File.Move(LastReplay, FileName);
                    }
                    else if (Settings.NoSavedReplaySave)
                    {
                        if (!Directory.Exists(DocumentPath + @"\Replay\NoSavedReplay"))
                        {
                            Directory.CreateDirectory(DocumentPath + @"\Replay\NoSavedReplay");
                        }
                        FileName = $"{DocumentPath}\\Replay\\NoSavedReplay\\{GetFileTime(LastReplay)}.w3g";
                        if (File.Exists(FileName))
                        {
                            File.Delete(FileName);
                        }
                        File.Move(LastReplay, FileName);
                    }
                }
            }
            catch { }
            MainWorker.ReplayWatcher.EnableRaisingEvents = true;
        }
예제 #3
0
        internal static async void MemoryOptimize(string[] args)
        {
            if (Settings.IsMemoryOptimize)
            {
                MemoryOptimizeChecker.Restart();
            }
            int ResultDelay;

            if (!(args?.Length > 1) || string.IsNullOrEmpty(args[1]))
            {
                ResultDelay = 5;
                SendMsg(true, "워크래프트 3 메모리 최적화를 시도합니다.");
            }
            else
            {
                try
                {
                    ResultDelay = int.Parse(args[1]);
                    if (ResultDelay < 0)
                    {
                        ResultDelay = 0;
                    }
                    if (ResultDelay > 10)
                    {
                        ResultDelay = 10;
                    }
                }
                catch
                {
                    ResultDelay = 5;
                }
                if (ResultDelay > 0)
                {
                    SendMsg(true, $"워크래프트 3 메모리 최적화를 시도합니다. ({ResultDelay}초 후 결과 계산)");
                }
            }
            if (await CProcess.TrimProcessMemory(ResultDelay))
            {
                long ChangedMemory = CProcess.MemoryValue[0] - CProcess.MemoryValue[2];
                if (ChangedMemory < 0)
                {
                    SendMsg(true, $"결과: {ConvertSize(CProcess.MemoryValue[0])} + {ConvertSize(-ChangedMemory)} = {ConvertSize(CProcess.MemoryValue[2])}");
                }
                else
                {
                    SendMsg(true, $"결과: {ConvertSize(CProcess.MemoryValue[0])} - {ConvertSize(ChangedMemory)} = {ConvertSize(CProcess.MemoryValue[2])}");
                }
                return;
            }
Error:
            SendMsg(true, "Error - 최적화 중에 예외가 발생했습니다.");
        }
예제 #4
0
        public static void Init()
        {
            InitHotkey();
            InitCommand();

            //AntiZombieProcessChecker = new HangWatchdog(0, 0, 5);
            //AntiZombieProcessChecker.Condition = () => (Warcraft3Info.Process?.MainWindowHandle == IntPtr.Zero) ?? false;
            //AntiZombieProcessChecker.Actions += () => Warcraft3Info.Close();

            MemoryOptimizeChecker           = new HangWatchdog(() => new TimeSpan(0, Settings.MemoryOptimizeCoolDown, 0));
            MemoryOptimizeChecker.Condition = () => Settings.IsMemoryOptimize;
            MemoryOptimizeChecker.Actions  += async() => await CProcess.TrimProcessMemory(true);
        }
예제 #5
0
        internal static bool ProcessCheck()
        {
            if (GameModule.WarcraftDetect() != WarcraftState.OK ||
                !GameModule.WarcraftCheck())
            {
                InitializedWarcraft = ignoreDetect = false;

                // 프로그램을 찾지 못할 경우 검색 간격 증가
                Thread.Sleep(800);

                return(true);
            }
            if (!InitializedWarcraft)
            {
                InitializedWarcraft = true;
                Delay(2000);
                GameDll.GetOffset();
                GameDelay       = 50;
                RefreshCooldown = 0.01f;
                name            = string.Empty;
                StartDelay      = Settings.StartSpeed > 0 ? Settings.StartSpeed : 0.01f;
                CameraDistance  = Settings.CameraDistance;
                CameraAngleX    = Settings.CameraAngleX;
                CameraAngleY    = Settings.CameraAngleY;
            }
            if (Settings.IsAutoHp && !HPView)
            {
                HPView = true;
            }

            if (Settings.IsAntiZombieProcess)
            {
                if (ignoreDetect && ++ZombieCount > 9000)
                {
                    ignoreDetect = false;
                    ZombieCount  = 0;
                }
                else if (CurrentMusicState == MusicState.None)
                {
                    if (++ZombieCount > 22)
                    {
                        try
                        {
                            PerformanceCounter CPUCounter = new PerformanceCounter("Process", "% Processor Time", TargetProcess);
                            CPUCounter.NextValue();
                            for (int i = 0; i < 5; i++)
                            {
                                Delay(1100);
                                if (CPUCounter.NextValue() >= 0.01f)
                                {
                                    ZombieCount = 0;
                                    break;
                                }
                                if (i != 4)
                                {
                                    continue;
                                }
                                if (MetroDialog.YesNo("워크래프트가 정상적으로 종료되지 않은 것 같습니다.\n강제로 종료하시겠습니까?", "강제 종료 알림"))
                                {
                                    try
                                    {
                                        Warcraft3Info.Process.Kill();
                                    }
                                    catch
                                    {
                                        MetroDialog.OK("워크래프트를 강제로 종료할 수 없었습니다.\n이미 종료되었거나, 백신에 의해 차단된 것 같습니다.", "강제 종료 실패");
                                    }
                                }
                                else
                                {
                                    ignoreDetect = true;
                                }
                            }
                        }
                        catch
                        {
                            ZombieCount = 0;
                        }
                    }
                    return(true);
                }
                else
                {
                    ZombieCount = 0;
                }
            }
            if (Settings.IsMemoryOptimize)
            {
                if (MemoryOptimizeTimer.IsRunning)
                {
                    if (MemoryOptimizeTimer.Elapsed >= new TimeSpan(0, Settings.MemoryOptimizeCoolDown, 0))
                    {
                        CProcess.TrimProcessMemory(TargetProcess, true);
                        MemoryOptimizeTimer.Restart();
                    }
                    else
                    {
                        MemoryOptimizeTimer.Start();
                    }
                }
            }
            else if (MemoryOptimizeTimer.IsRunning)
            {
                MemoryOptimizeTimer.Stop();
            }

            StatusCheck();
            return(false);
        }