Babu.R.K Ответов: 0

Найти активный процесс окна, состояние которого развернуто и усилитель; & нормальный берет больше ресурсов ЦП


Ниже приведен код для поиска активного процесса, состояние окна которого максимизировано и нормально. Но ИС берет еще чашку. Пожалуйста, помогите мне уменьшить загрузку процессора. Он принимает 18% чашки, пока работает диагностика.

Что я уже пробовал:

IEnumerable<Process> processes = Process.GetProcesses()
               .Where(p => (long)p.MainWindowHandle != 0
                         && p.MainWindowTitle.Length > 0
                         && (p.StartInfo.WindowStyle == ProcessWindowStyle.Maximized
                                 || p.StartInfo.WindowStyle == ProcessWindowStyle.Normal)
                         && (WindowState.GetWindowState(p.MainWindowHandle) == "Maximized"
                                 || WindowState.GetWindowState(p.MainWindowHandle) == "Normal")
                         );



public static class WindowState
    {
        private static WINDOWPLACEMENT GetPlacement(IntPtr hwnd)
        {
            WINDOWPLACEMENT placement = new WINDOWPLACEMENT();
            placement.length = Marshal.SizeOf(placement);
            GetWindowPlacement(hwnd, ref placement);
            return placement;
        }

        public static string GetWindowState(IntPtr hwnd)
        {
            WINDOWPLACEMENT placement = GetPlacement(hwnd);

            if (placement.showCmd == ShowWindowCommands.Minimized)
                return "Minimized";

            if (placement.showCmd == ShowWindowCommands.Maximized)
                return "Maximized";

            if (placement.showCmd == ShowWindowCommands.Hide)
                return "Hide";

            if (placement.showCmd == ShowWindowCommands.Normal)
                return "Normal";

            return string.Empty;
        }

        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal static extern bool GetWindowPlacement(
            IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);
        internal enum ShowWindowCommands : int
        {
            Hide = 0,
            Normal = 1,
            Minimized = 2,
            Maximized = 3,
        }

        [Serializable]
        [StructLayout(LayoutKind.Sequential)]
        internal struct WINDOWPLACEMENT
        {
            public int length;
            public int flags;
            public ShowWindowCommands showCmd;
            public System.Drawing.Point ptMinPosition;
            public System.Drawing.Point ptMaxPosition;
            public System.Drawing.Rectangle rcNormalPosition;
        }

        [DllImport("user32.dll")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
    }

Richard Deeming

Единственное что бросается мне в глаза это то что ты звонишь GetWindowState дважды для каждого процесса.

Также странно, что вы преобразуете целое число в строку, когда сравнение строк менее эффективно, чем сравнение целых чисел.

Кроме того, вам нужно будет профилировать свой код, чтобы узнать, где находится узкое место. Если у вас еще нет профилировщика, попробуйте CodeTrack[^].

Babu.R.K

Спасибо, это действительно помогло.

0 Ответов