powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Предотвращение повторного запуска проги
5 сообщений из 5, страница 1 из 1
Предотвращение повторного запуска проги
    #32687453
James Bond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, как программно не дать юзеру запустить прогу, если она уже запущена?
...
Рейтинг: 0 / 0
Предотвращение повторного запуска проги
    #32688011
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй использовать Mutex
...
Рейтинг: 0 / 0
Предотвращение повторного запуска проги
    #32688621
lisichanec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такой класс...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
Imports System
Imports System.Threading
Imports System.Diagnostics
Imports System.Runtime.InteropServices


Public NotInheritable Class CheckOneInstance
    Private Shared mutex As Mutex

     'Создавать экземпляры этого класса нет смысла  
    Sub New()

    End Sub  'New 

    Public Shared Function IsInstanceExist(ByVal activateFirstInstance As Boolean) As Boolean
        Dim currentProcess As Process = Process.GetCurrentProcess()
        Dim createdNew As Boolean

         'Имя Mutex'a состоит из имени исполняемого файла + строковая константа 
        Dim mutexName As String = currentProcess.MainModule.ModuleName + " One Instance Mutex Name"
        mutex = New Mutex(False, mutexName, createdNew)

        If Not createdNew Then
            If Not activateFirstInstance Then
                Return True
            End If
             'получаем имя нашего процесса (название файла без расширения '.exe')  
            Dim processName As String = currentProcess.MainModule.ModuleName
            processName = processName.Substring( 0 , processName.IndexOf(".exe"))

             'перебираем все процессы с искомым именем  
            Dim process As Process
            For Each process In Process.GetProcessesByName(processName)
                 'текущий экземпляр нас не интересует  
                If process.Id = currentProcess.Id Then
                    GoTo ContinueForEach1
                End If
                 'могут быть разные приложения с одинаковым именем  
                 'исполняемого файла. Проверяем что-бы это был 'наш' файл  
                If process.MainModule.FileName <> currentProcess.MainModule.FileName Then
                    GoTo ContinueForEach1
                End If
                Dim hWnd As IntPtr
                If process.MainWindowHandle.Equals(IntPtr.Zero) Then
                     'По каким-то причинам(например у окна ShowInTaskBar = false) 
                     'MainWindowHandle равен 0. Попытаемся найти окно при помощи 
                     'Win32 API функций 
                    hWnd = FindWindowEngine.Find(process.Id)
                    If hWnd.Equals(IntPtr.Zero) Then
                        Exit For  'Окно так и неудалось найти, выходим. 
                    End If
                Else
                    hWnd = process.MainWindowHandle
                End If
                 'Активизируем окно приложения  
                If IsIconic(hWnd) Then
                    ShowWindow(hWnd, SW_RESTORE)
                Else
                    SetForegroundWindow(hWnd)
                End If
                Exit For
ContinueForEach1:
            Next process
            Return True
        End If
        Return False

    End Function  'IsInstanceExist 


    <DllImport("User32.dll")> _
    Shared Function SetForegroundWindow(ByVal hWnd As IntPtr) As Boolean
    End Function


    <DllImport("User32.dll")> _
    Shared Function IsIconic(ByVal hWnd As IntPtr) As Boolean
    End Function


    <DllImport("User32.dll")> _
    Shared Function ShowWindow(ByVal hWnd As IntPtr, ByVal nCmdShow As Integer) As Boolean
    End Function

    Private Const SW_RESTORE As Integer =  9 

End Class  'CheckOneInstance 

 'Этот класс предоставляет метод для поиска среди окон 'верхнего уровня' 
 'окна созданного указанным процессом 

NotInheritable Class FindWindowEngine

     'Создавать экземпляры этого класса нет смысла 
    Sub New()

    End Sub  'New 

    Private Shared hWndFirstInstance As IntPtr

    Public Shared Function Find(ByVal processID As Integer) As IntPtr
        Dim enumProc As New EnumWindowsProcDelegate(EnumWindowsProc)
         'Перебираем все окна 'верхнего' уровня 
        EnumWindows(enumProc, CType(processID, IntPtr))
        Return hWndFirstInstance

    End Function  'Find 

    Shared Function EnumWindowsProc(ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As Boolean
        Dim processIDFinded As Integer
         'Получаем ID процесса, создавшего данный hWnd  
        GetWindowThreadProcessId(hWnd, processIDFinded)
        If processIDFinded = lParam.ToInt32() Then
             'Нашли искомый процесс 
             'сохраняем hWnd и прекращаем перебор окон 
            hWndFirstInstance = hWnd
            Return False
        End If
         'продолжаем перебор окон 
        Return True

    End Function  'EnumWindowsProc 

     'Делегат для функции EnumWindows 
    Delegate Function EnumWindowsProcDelegate(ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As Boolean

    <DllImport("User32.dll")> _
    Shared Function EnumWindows(ByVal lpEnumFunc As EnumWindowsProcDelegate, ByVal lParam As IntPtr) As Boolean

    End Function

    <DllImport("User32.dll")> _
    Shared Function GetWindowThreadProcessId(ByVal hWnd As IntPtr, ByRef lpdwProcessId As Integer) As Integer

    End Function

End Class 'FindWindowEngine

А пользовать приблизительно так:

Код: plaintext
1.
2.
        If CheckOneInstance.IsInstanceExist(True) Then
            Return
        End If
...
Рейтинг: 0 / 0
Предотвращение повторного запуска проги
    #32688624
lisichanec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно еще глянуть сюда

http://www.codeproject.com/vb/net/sing_inistan.asp

Single Instance Application in VB.NET
By Detlef Grohs

An article attempting to demonstrate how to get an application to behave as a Single Instance in .NET.
...
Рейтинг: 0 / 0
Предотвращение повторного запуска проги
    #32688719
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+
Обсуждалось уже здесь:
/topic/97259

И там же смотрите ссылку vladgrig

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Предотвращение повторного запуска проги
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]