Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
9 / 9 / 4
Регистрация: 27.01.2013
Сообщений: 451

Узнать hWnd, зная имя файла приложения

21.04.2020, 16:27. Показов 1590. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

Запущен процесс "MsgLab.exe". Необходимо найти его hWnd и показать его, так как он свёрнут.
Подскажите, пожалуйста, что я не так делаю в коде?

Visual Basic
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
Option Explicit
 
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
Const MAX_PATH As Integer = 260
 
Private Type PROCESSENTRY32
  dwSize As Long
  cntUsage As Long
  th32ProcessID As Long
  th32DefaultHeapID As Long
  th32ModuleID As Long
  cntThreads As Long
  th32ParentProcessID As Long
  pcPriClassBase As Long
  dwFlags As Long
  szExeFile As String * MAX_PATH
End Type
 
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Sub CloseHandle Lib "kernel32" (ByVal hPass As Long)
 
Const SW_NORMAL = 1
Const SW_MAXIMIZE = 3
Const SW_MINIMIZE = 6
 
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function SetActiveWindow Lib "user32" (ByVal hwnd As Long) As Long
 
 
Public Function GetWndProcess(ByVal name_proc As String) As Long
 
Dim hSnapShot As Long
Dim uProcess As PROCESSENTRY32
Dim r As Long
Dim ProcessName As String
 
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&)
uProcess.dwSize = Len(uProcess)
r = Process32First(hSnapShot, uProcess)
 
 
Do While r
  ProcessName = Left$(uProcess.szExeFile, IIf(InStr(uProcess.szExeFile, Chr$(0)) > 0, InStr(uProcess.szExeFile, Chr$(0)) - 1, 0))
 
  If ProcessName = name_proc Then
    GetWndProcess = OpenProcess(&H1, False, uProcess.th32ProcessID)
    Exit Do
  End If
 
  r = Process32Next(hSnapShot, uProcess)
 
Loop
 
CloseHandle hSnapShot
 
End Function
 
 
Private Sub Form_Load()
 
Dim hWnd_app As Long
 
hWnd_app = GetWndProcess("MsgLab.exe")
ShowWindow hWnd_app, SW_NORMAL
 
CloseHandle hWnd_app
 
End Sub
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.04.2020, 16:27
Ответы с готовыми решениями:

Как, зная hWnd формы определить ее имя (Name)?
HI ALL Как, зная hWnd формы определить (узнать) ее имя (Name)? Заранее благодарю. P.S. Нужен пример без цикла: For I = 0...

Как, зная hWnd формы определить ее имя (Name)?
HI ALL Как, зная hWnd формы определить (узнать) ее имя (Name)? Заранее благодарю. P.S. Нужен пример без цикла: For I = 0...

Как узнать lpClassName зная Hwnd ???
Как узнать lpClassName зная Hwnd ???

10
sleep
 Аватар для I can
4924 / 4573 / 840
Регистрация: 13.04.2015
Сообщений: 9,724
21.04.2020, 16:33
Цитата Сообщение от Saliery Посмотреть сообщение
hWnd_app = GetWndProcess("MsgLab.exe")
А hWnd_app определяется ?
Он должен быть отличен от 0.
Попробуйте имя процесса написать без .exe
1
9 / 9 / 4
Регистрация: 27.01.2013
Сообщений: 451
21.04.2020, 18:16  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
Он должен быть отличен от 0.
да, как правило, это 3-хзначное число

Добавлено через 21 секунду
Цитата Сообщение от I can Посмотреть сообщение
Попробуйте имя процесса написать без .exe
тогда hWnd_app=0
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
21.04.2020, 20:27
GetWndProcess возвращает не хендл окна, а хендл процесса. Можно воспользоваться EnumWindows и GetWindowThreadProcessId чтобы получить окна верхнего уровня процесса.
1
9 / 9 / 4
Регистрация: 27.01.2013
Сообщений: 451
21.04.2020, 23:37  [ТС]
Получилось таким образом вывести сразу несколько hWnd одного окна "MsgLab.exe", а нужен только 1, который именно отвечал бы за окно! Как его выделить из общего списка hWnd (там их у меня 4 штуки вывелось)?

Visual Basic
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
Public Function EnumWindows() As String()
    Dim r As Long
    Dim pArr() As String
    Dim count As Long
    Dim hwnd As Long
    
    Dim sss As String
    
    Dim vvv As String
    
    Dim sSave As String
    Dim Ret As Long
    
    Dim mv As Long
    
    Dim sw_found As LogVar
    Dim ccc() As String
    
    Dim ddd() As String
    
    sw_found = 0
    
    vvv = "MsgLab.exe"
    
      Dim hWndChildProcessID As Long
    
    r = GetWindow(GetDesktopWindow, GW_CHILD)
    
     
    Do While r
    
            sss = GetExeFromHandle(r)
            
                       
            If sss = vvv Then
    
          Add_Array ccc, r: sw_found = 1
            ElseIf sss <> vvv And sw_found = 1 Then Exit Do
            End If
        
        DoEvents
        count = count + 1
        r = GetWindow(r, GW_HWNDNEXT)
        
        
    Loop
 
    EnumWindows = ccc
End Function
 
 
Public Function GetExeFromHandle(hwnd As Long) As String
Dim threadID As Long, processID As Long, hSnapshot As Long
Dim uProcess As PROCESSENTRY32, rProcessFound As Long
Dim i As Integer, szExename As String
    threadID = GetWindowThreadProcessId(hwnd, processID)
    If threadID = 0 Or processID = 0 Then Exit Function
    hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
    If hSnapshot = -1 Then Exit Function
    uProcess.dwSize = Len(uProcess)
    rProcessFound = ProcessFirst(hSnapshot, uProcess)
    Do While rProcessFound
        If uProcess.th32ProcessID = processID Then
            i = InStr(1, uProcess.szExeFile, Chr(0))
            If i > 0 Then szExename = Left$(uProcess.szExeFile, i - 1)
            Exit Do
        Else
            rProcessFound = ProcessNext(hSnapshot, uProcess)
        End If
    Loop
    Call CloseHandle(hSnapshot)
    GetExeFromHandle = szExename
End Function
0
sleep
 Аватар для I can
4924 / 4573 / 840
Регистрация: 13.04.2015
Сообщений: 9,724
22.04.2020, 13:02
Цитата Сообщение от Saliery Посмотреть сообщение
а нужен только 1, который именно отвечал бы за окно
Искать окно по заголовку через FindWindow
1
9 / 9 / 4
Регистрация: 27.01.2013
Сообщений: 451
22.04.2020, 13:44  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
по заголовку
а если я не знаю, какой заголовок у окна?
0
sleep
 Аватар для I can
4924 / 4573 / 840
Регистрация: 13.04.2015
Сообщений: 9,724
22.04.2020, 14:26
Цитата Сообщение от Saliery Посмотреть сообщение
какой заголовок у окна?
А как вы его отличаете от других ? По цвету ?
1
9 / 9 / 4
Регистрация: 27.01.2013
Сообщений: 451
22.04.2020, 14:50  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
отличаете
отличаю по имени файла

заголовок может быть переменный, его может вовсе не быть
надо как-то без заголовка постараться обойтись

разве нет функции, которая бы из 4 hWnd показывала бы тот, который именно окну принадлежит, с которым можно управлять окном?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
22.04.2020, 15:21
Лучший ответ Сообщение было отмечено Saliery как решение

Решение

Saliery, я вам написал:
Цитата Сообщение от The trick Посмотреть сообщение
Можно воспользоваться EnumWindows и GetWindowThreadProcessId чтобы получить окна верхнего уровня процесса.
Что Вы сделали, одному Вам известно.
1
9 / 9 / 4
Регистрация: 27.01.2013
Сообщений: 451
23.04.2020, 01:47  [ТС]
Нашёл хороший пример (прикрепил во вложении).
Ещё нашёл несколько примеров в интернете.
Из них скомпоновал такие функции.
API констант или функций, типов может не хватать, вырезал из рабочей программы.
Основные функции постарался учесть.

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

The trick, вам отдельное спасибо за всё!!!

Visual Basic
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
Option Explicit
 
Public Name_EXE As String
Public hWnd_list() As String
 
 
 
Public Const GW_CHILD = 5
Public Const GW_HWNDNEXT = 2
 
 
 
Public Const TH32CS_SNAPHEAPLIST = &H1
Public Const TH32CS_SNAPPROCESS = &H2
Public Const TH32CS_SNAPTHREAD = &H4
Public Const TH32CS_SNAPMODULE = &H8
Public Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
Const MAX_PATH As Integer = 260
 
Public Type PROCESSENTRY32
  dwSize As Long
  cntUsage As Long
  th32ProcessID As Long
  th32DefaultHeapID As Long
  th32ModuleID As Long
  cntThreads As Long
  th32ParentProcessID As Long
  pcPriClassBase As Long
  dwFlags As Long
  szExeFile As String * MAX_PATH
End Type
 
 Public Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlgas As Long, ByVal lProcessID As Long) As Long
Public Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Public Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Sub CloseHandle Lib "kernel32" (ByVal hPass As Long)
Public Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
 
 
Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean
 
Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Public Declare Function GetDesktopWindow Lib "user32" () As Long
Public Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Public Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long
 
 Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
 
 
 
Public Function hWndFromEXE(ByVal str_name_EXE As String) As Long
 
Name_EXE = str_name_EXE
 
EnumWindows AddressOf EnumWindowsProc, ByVal 0&
 
hWndFromEXE = Val(hWnd_list(0))
 
End Function
 
 
 
 
Public Function hWndFromInvisibleEXE(ByVal str_name_EXE As String) As Long ' String()
 
Dim r As Long
Dim m As Long
 
Dim sss As String
 
Dim sSave As String
Dim Ret As Long
 
 
Dim sw_found As LogVar
Dim ccc() As String
 
sw_found = 0
 
 
r = GetWindow(GetDesktopWindow, GW_CHILD)
 
 
Do While r
 
sss = GetExeFromHandle(r)
 
 
Ret = GetWindowTextLength(r)
sSave = Space(Ret)
GetWindowText r, sSave, Ret + 1
 
If sss = str_name_EXE Then
 
sw_found = 1
 
Add_Array ccc, r ' моя ф-я добавления в массив ccc строки r, она не показана тут
 
m = IsWindowVisible(r)
 
If m = 0 Then hWndFromInvisibleEXE = r
 
ElseIf sss <> str_name_EXE And sw_found = 1 Then Exit Do
 
End If
 
 
 
DoEvents
r = GetWindow(r, GW_HWNDNEXT)
 
Loop
 
 
End Function
 
 
 
Public Function GetExeFromHandle(ByVal h_hwnd As Long) As String
 
Dim threadID As Long
Dim processID As Long
Dim hSnapshot As Long
 
Dim uProcess As PROCESSENTRY32
Dim rProcessFound As Long
 
Dim i As Integer
Dim szExename As String
 
 
    threadID = GetWindowThreadProcessId(h_hwnd, processID)
    If threadID = 0 Or processID = 0 Then Exit Function
 
    hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
    If hSnapshot = -1 Then Exit Function
 
    uProcess.dwSize = Len(uProcess)
    rProcessFound = Process32First(hSnapshot, uProcess)
 
 
    Do While rProcessFound
 
        If uProcess.th32ProcessID = processID Then
            i = InStr(1, uProcess.szExeFile, Chr(0))
            If i > 0 Then szExename = Left$(uProcess.szExeFile, i - 1)
            Exit Do
        Else
            rProcessFound = Process32Next(hSnapshot, uProcess)
        End If
 
    Loop
 
 
    Call CloseHandle(hSnapshot)
 
    GetExeFromHandle = szExename
 
 
End Function
 
 
Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
 
 
EnumWindowsProc = True
 
 
If GetExeFromHandle(hwnd) = Name_EXE Then Add_Array hWnd_list, hwnd ' моя ф-я добавления в массив hWnd_list строки hwnd, она не показана тут
 
 
End Function
Вложения
Тип файла: rar GetHwnd.rar (2.3 Кб, 9 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.04.2020, 01:47
Помогаю со студенческими работами здесь

Как зная hWnd контекстного меню узнать его hMenu?
HI ALL Как зная hWnd контекстного меню узнать его hMenu. (Похоже что GetMenu его не находит. Так как IsMenu не подтверждает.)...

Зная имя хоста – узнать IP-адрес машины.
Доброе время суток. Если у кого найдётся время - help? Plizz Мой вопрос: Что нужно: Программно через VB/VBA... ...

Как узнать полное имя файла зная его краткое имя?
например при запуске программы достаточно написать &quot;Excel&quot; или &quot;Calc&quot; при этом система уже в курсе где этот файл лежит. как программно...

Как в C++ Win32 зная ID своей (например кнопки) узнать её HWND ???
Как в C++ Win32 зная ID своей (например кнопки) узнать её HWND ??? Где-то видел API функцию... Весь инет обыскал... Заранее спасибо

Как узнать имя процесса, зная имя программы?
Здравствуйте, подскажите пожалуйста, как узнать имя процесса выполняемой программы, зная имя этой программы в c#? P.S. Если это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru