small Вопрос

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

small Вопрос

Сообщение Fedorfx » 11.01.2005 (Вт) 0:33

Наверное было уже но глаза слипаются а может к обеду кто и ответит.
Как имея exe найти его в запущенных процессах и получить его Caption( он меняется и поэтому искать FindWindow используя Caption не получиться.) А что за такое класс окна я этой ночью допереть не могу.
Спасибо.

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 11.01.2005 (Вт) 2:53

Вот так:
1.Перечисляем процессы и по имени ищем нужный PID
Код: Выделить всё
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 Sub CloseHandle Lib "Kernel32" (ByVal hPass As Long)
Function GetPIDbyExe(exename as string) as long
    Dim hSnapShot As Long, uProcess As PROCESSENTRY32
    hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&)

    uProcess.dwSize = Len(uProcess)
    r = Process32First(hSnapShot, uProcess)


    Do While r
        if Left$(uProcess.szExeFile, IIf(InStr(1, uProcess.szExeFile, Chr$(0)) > 0, InStr(1, uProcess.szExeFile, Chr$(0)) - 1, 0)) = exename then
GetPIDbyExe =   uprocess.th32ProcessID
    CloseHandle hSnapShot
exit sub
end if
        r = Process32Next(hSnapShot, uProcess)
    Loop
    'close our snapshot handle
    CloseHandle hSnapShot
End Function

2.Далее перечисляем все окна, и с помощью GetWindowThreadProcessId
узнаем какому процессу оно пренадлежит, если выбраному процессу, то выходим из цыкла, и получаем хендл
Код: Выделить всё
Const GW_HWNDNEXT = 2
Dim mWnd As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long

Function InstanceToWnd(ByVal target_pid As Long) As Long
    Dim test_hwnd As Long, test_pid As Long, test_thread_id As Long
    'Find the first window
    test_hwnd = FindWindow(ByVal 0&, ByVal 0&)
    Do While test_hwnd <> 0
        'Check if the window isn't a child
        If GetParent(test_hwnd) = 0 Then
            'Get the window's thread
            test_thread_id = GetWindowThreadProcessId(test_hwnd, test_pid)
            If test_pid = target_pid Then
                InstanceToWnd = test_hwnd
                Exit Do
            End If
        End If
        'retrieve the next window
        test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)
    Loop
End Function

3.Достаем текст
[code]
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Function GetWinText(handle as long) as string
Dim s As String
s = String(255, Chr$(0))
GetWindowText handle, s, 255
getwintext = s
end function
end sub
[code]
Есть некоторые нюансы Process32First, в 98 достает полный путь к ехе-шнику(C:\windows\taskmgr.exe), а в НТ, краткий(taskmgr.exe).
Понятно :?:
الفيجوال بيسك الرابح

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.01.2005 (Вт) 4:48

На то, что Toolhelp32-функций нету в WinNT4, все дружно забили? :-)
Мне больше нравится NtQueryInformationProcess: он есть во всей линейке WinNT.
Изображение

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 11.01.2005 (Вт) 8:41

Я описал лиш простейший случай.
Можно кстати через NtQueryInformationProcess сразу узнать хендл окна. А для перечислений в WinNT4 можна воспользоватся:
Код: Выделить всё
Declare Function EnumProcesses Lib "PSAPI.DLL" (ByRef lpidProcess As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
.
الفيجوال بيسك الرابح

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.01.2005 (Вт) 9:47

psapi не предустановлена в WinNT4 (т.е. её надо тащить за собой).
Она предустановлена только в Win2000+, т.ч. это наименее универсальный способ.
Изображение

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 11.01.2005 (Вт) 11:45

Либо глюк форума либо...
Поиск NtQueryInformationProcess не дает результата. Хотя в предыдущем посте это слово есть.
Либо ограничение по длинне слова, что скорее всего.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.01.2005 (Вт) 12:14

Ты лучше в MSDN поищи, здесь.
Lasciate ogni speranza, voi ch'entrate.

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 11.01.2005 (Вт) 15:25

Опс .
А окон то в процессе штук 20.
Придеться все таки сортировать по типу класса.
Может кто подскажет как зная Hwnd получить информацию о этом окне??
P.S. Был у меня справочник по API где были сгруппированы Api шки по группам. Типа група для работы с окнами группа для работы с графиками. Снес при перестановке виндов.Подскажите ссылочку, думаю вопросов станет меньше :-)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.01.2005 (Вт) 15:27

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


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 9

    TopList