powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Запущена ли прога (окно или имя консольного .exe)? Закрыть все эти проги.
5 сообщений из 5, страница 1 из 1
Запущена ли прога (окно или имя консольного .exe)? Закрыть все эти проги.
    #38835544
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я делаю поиск по заголовку окна.
Вариант 1.
Консольное приложение proga.exe (в заголовке будет комбинация "proga.exe")
Вариант 2.
Вхождение например слова "Мое приложение - журнал": все окна вида "Мое приложение - главное окно", "" Вот - Мое приложение"
Как вариант можно еще для проверки проверять дочернее окно "Моя кнопка". (FindWindowEx)

Вопрос, как это сделать через .Net?

Я посмотрел в сторону Diagnostic.Process но что-то это не совсем то.
Или дайте мне код если у кого есть надежный.
Но прошу обратить внимание на то как я это делаю:
EnumProc -поиск окна по вхождению заданного текста
EndTask(TargetHwnd) + WM_CLOSE -"убийство".
Причем код должен работать и для myconsole.exe и для "Мое приложение - мое окно" (WinForm т.е.)

Собственно мой проверенный годами (из VB6) код:
За час я его передрал на .Net -вроде все работает.
И вот думаю - оставить, или врубаться в .Net-технологии?
Оно по идее должно быть "меньше буков", но будет ли "оно" так же надежно?

Код: vbnet
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.
  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles ButtonIsProgaRun.Click
    MsgBox(IsProgaRun("proga.exe"))
    'MsgBox(IsProgaRun("Мое приложение"))
  End Sub

  Private Sub ButtonKillProga_Click(sender As Object, e As EventArgs) Handles ButtonKillProga.Click
    KillProga("proga.exe")
    'KillProga("Мое приложение")
 End Sub

Module Module1
  Dim TargetName As String
  Dim TargetHwnd As IntPtr

  Public Declare Function EnumWindows Lib "user32" _
   (ByVal lpEnumFunc As EnumWindowsProc, ByVal lParam As IntPtr) As Boolean
  Public Delegate Function EnumWindowsProc _
   (ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As Boolean

  Public Declare Unicode Function GetWindowText Lib "user32" Alias _
   "GetWindowTextW" (ByVal hwnd As IntPtr, ByVal lpString As String, _
   ByVal nMaxCount As Integer) As Integer

  Public Declare Function IsWindow Lib "user32" (ByVal hwnd As IntPtr) As Boolean

  Public Const GWL_STYLE = (-16)

  Public Declare Unicode Function GetWindowLong Lib "user32" Alias _
   "GetWindowLongW" (ByVal hwnd As IntPtr, ByVal nIndex As Integer) As Integer

  'Window Styles
  Public Const WS_DISABLED As Integer = &H8000000

  Public Const WS_CANCELMODE = &H1F

  'Window Notifications
  Public Const WM_CLOSE = &H10

  Public Declare Unicode Function PostMessage Lib "user32" Alias "PostMessageW" _
   (ByVal hwnd As IntPtr, ByVal wMsg As UInteger, ByVal wParam As UIntPtr, ByVal lParam As IntPtr) As Integer

  Public Function IsProgaRun(ByVal proga As String) As Boolean
    TargetName = proga
    TargetHwnd = IntPtr.Zero
    ' Examine the window names.
    EnumWindows(New EnumWindowsProc(AddressOf EnumProc), 0)
    ' See if we got an hwnd.
    IsProgaRun = (TargetHwnd <> IntPtr.Zero)
  End Function

  Private Function EnumProc(ByVal app_hwnd As IntPtr, _
   ByVal lParam As Integer) As Boolean
    ' Return False to stop the enumeration.

    ' Get the window's title.
    Dim buf As String = StrDup(256, Chr(0))
    Dim length As Integer = GetWindowText(app_hwnd, buf, Strings.Len(buf) + 1)
    Dim Title As String = buf.Substring(0, length)

    ' See if the title contains the target.
    If InStr(Title, TargetName) > 0 Then
      ' Save the hwnd and end the enumeration.
      TargetHwnd = app_hwnd
      Return False ' Save the hwnd and end the enumeration
    End If

    Return True ' Continue the enumeration (default)
  End Function

  Public Sub KillProga(ByVal proga As String)
    Do
      TargetName = proga
      TargetHwnd = IntPtr.Zero
      ' Examine the window names.
      EnumWindows(New EnumWindowsProc(AddressOf EnumProc), 0)
      ' See if we got an hwnd.
      If TargetHwnd = IntPtr.Zero Then
        Exit Do
      Else
        EndTask(TargetHwnd)
      End If
    Loop
  End Sub

  Public Sub EndTask(ByVal TargetHwnd As IntPtr)
    'Close the window
    If IsWindow(TargetHwnd) Then
      If Not (GetWindowLong(TargetHwnd, GWL_STYLE) _
       And WS_DISABLED) Then
        PostMessage(TargetHwnd, WS_CANCELMODE, UIntPtr.Zero, IntPtr.Zero)
        PostMessage(TargetHwnd, WM_CLOSE, UIntPtr.Zero, IntPtr.Zero)
        Application.DoEvents()
      End If
    End If
  End Sub

End Module
...
Рейтинг: 0 / 0
Запущена ли прога (окно или имя консольного .exe)? Закрыть все эти проги.
    #38835601
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сварганил такой код:

Код: vbnet
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.
  Public Function IsProgaRunNet(ByVal proga As String) As Boolean
    IsProgaRunNet = False
    Dim aoAllProcesses As Diagnostics.Process() = Diagnostics.Process.GetProcesses()
    For Each oProc As Diagnostics.Process In aoAllProcesses
      If InStr(oProc.MainWindowTitle, proga) > 0 Then
        oProc.Close()
        IsProgaRunNet = True
        Exit Function
      ElseIf oProc.ProcessName = proga Then
        oProc.Close()
        IsProgaRunNet = True
        Exit Function
      End If
    Next

    If Right(UCase(proga), 4) = ".EXE" Then
      Dim processName As String = proga.Substring(0, UCase(proga).IndexOf(".EXE"))
      Dim aoProcsByName As Diagnostics.Process() = Diagnostics.Process.GetProcessesByName(processName)
      If aoProcsByName.Length > 0 Then IsProgaRunNet = True
      For Each oProc As Diagnostics.Process In aoProcsByName
        oProc.Close()
      Next
    End If
  End Function

  Public Sub KillProgaNet(ByVal proga As String)
    Dim aoAllProcesses As Diagnostics.Process() = Diagnostics.Process.GetProcesses()
    For Each oProc As Diagnostics.Process In aoAllProcesses
      If InStr(oProc.MainWindowTitle, proga) > 0 Then
        oProc.CloseMainWindow()
        Application.DoEvents()
      ElseIf oProc.ProcessName = proga Then
        oProc.CloseMainWindow()
        Application.DoEvents()
      End If
      oProc.Close()
    Next
    If Right(UCase(proga), 4) = ".EXE" Then
      Dim processName As String = proga.Substring(0, UCase(proga).IndexOf(".EXE"))
      Dim aoProcsByName As Diagnostics.Process() = Diagnostics.Process.GetProcessesByName(processName)
      For Each oProc As Diagnostics.Process In aoProcsByName
        oProc.CloseMainWindow()
        Application.DoEvents()
        oProc.Close()
      Next
    End If
  End Sub



Но он консоль с "proga.exe" не закрывает.
Если только через oProc.Kill()
На интересующую меня консоль повешен такой код:
Код: 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.
  SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE);
...
BOOL CtrlHandler(DWORD fdwCtrlType) 
{ 
  switch(fdwCtrlType) 
  { 
    case CTRL_C_EVENT:
    case CTRL_CLOSE_EVENT:
    case CTRL_BREAK_EVENT:
      manager->...
      //Beep(1000, 200); 
      return FALSE;
    case CTRL_LOGOFF_EVENT:
      if (!IsLocalSystem()) {
        manager->...
        //Beep(1000, 200); 
        //Beep(1000, 200); 
      }
      return FALSE; 
    case CTRL_SHUTDOWN_EVENT: 
    default: 
      return FALSE; 
  } 
}



И я не уверен что он с .Net-овским Kill() отработает.
Апишное WM_CLOSE по окну консоли генерит CTRL_CLOSE_EVENT.
А .Net бьет похоже по процессу а не по окну консоли, что не совсем одно и то же.
Копаться неохота, поэтому разумней оставить апишный код.
...
Рейтинг: 0 / 0
Запущена ли прога (окно или имя консольного .exe)? Закрыть все эти проги.
    #38835649
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Я посмотрел в сторону Diagnostic.Process но что-то это не совсем то.
И чем же он не устроил?
Код: c#
1.
2.
foreach(var p in Process.GetProcessesByName("notepad"))
  p.Kill();
...
Рейтинг: 0 / 0
Запущена ли прога (окно или имя консольного .exe)? Закрыть все эти проги.
    #38835671
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныИ чем же он не устроил?
Код: c#
1.
2.
foreach(var p in Process.GetProcessesByName("notepad"))
  p.Kill();

Блокнот фиг с ним.
Знаешь, счас сделал тесты с моим консольным proga.exe. (неохота было, но поднапрягся, раскомментировал Beep-ы и дописал пару дебагов)
Глянь выше на сишный код BOOL CtrlHandler.
p.Kill(); -просто тупо терминейтит процесс(это не противоречит докам), CtrlHandler(код завершения) не выполняется.
Плюс еще исключения словил (почему не разбирался), а оно мне надо?

В принципе, p.CloseMainWindow() вызывает case CTRL_CLOSE_EVENT: -проверил
и казалось бы достаточно.
Но, есть одно жирное НО.
p.CloseMainWindow() не закрывает консоль, если консоль запущена в режиме HIDE (проверил).
А у меня как раз убиваемые проги запускаются в основном в HIDE.
Мой апишный EndTask шлет WM_CLOSE==CTRL_CLOSE_EVENT в любом случае.

Короче ну его в баню. API-шный код (первый пост) здесь лучше. И он проверенный. У меня ушел вчера час чтобы его переписать на .Net (ну ладно, каюсь, Delegate Function/Address Of как в .Net делается год назад долго искал, чтоб заработало). А мы сейчас будем 2 дня обсасывать Diagnostic.Process и прочие хрени, как это обычно бывает. Все, не хочу.
...
Рейтинг: 0 / 0
Запущена ли прога (окно или имя консольного .exe)? Закрыть все эти проги.
    #38835673
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, не переживайте, скоро мы просто перестанем в Ваши топики заглядывать. :)
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Запущена ли прога (окно или имя консольного .exe)? Закрыть все эти проги.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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