как найти hwnd окна с постоянно меняющимся заголовком

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

как найти hwnd окна с постоянно меняющимся заголовком

Сообщение iolaus » 13.10.2004 (Ср) 14:24

ну собственно сабж окно естественно не моей проги...
Последний раз редактировалось iolaus 13.10.2004 (Ср) 14:50, всего редактировалось 1 раз.
This message will self destruct in five seconds!!!

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

Сообщение tyomitch » 13.10.2004 (Ср) 14:33

по имени класса
по идентификатору процесса
как захочешь
Изображение

iolaus
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 19.03.2002 (Вт) 18:33
Откуда: Москва

Сообщение iolaus » 13.10.2004 (Ср) 14:46

а как по идентификатору процесса???
This message will self destruct in five seconds!!!

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

Сообщение tyomitch » 13.10.2004 (Ср) 15:13

Берёшь все окна, смотришь у каждого PID через GetWindowThreadProcessId, выбираешь нужные.
Изображение

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

Сообщение alibek » 13.10.2004 (Ср) 15:29

Лучше все-же по имени класса.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение tyomitch » 13.10.2004 (Ср) 15:39

А вдруг оно тоже меняется со временем? ;-)
Изображение

iolaus
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 19.03.2002 (Вт) 18:33
Откуда: Москва

Сообщение iolaus » 13.10.2004 (Ср) 15:42

погоди но GetWindowThreadProcessId ведь выдает ProcessId по hwnd а мне бы наоборот...
This message will self destruct in five seconds!!!

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

Сообщение alibek » 13.10.2004 (Ср) 16:07

Ты не понял. Получаешь ProcessId и смотришь, что это за проект. Если тот, что тебе нужен (например, находишь имя exe-файла), то используешь hWnd.
Lasciate ogni speranza, voi ch'entrate.

iolaus
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 19.03.2002 (Вт) 18:33
Откуда: Москва

Сообщение iolaus » 14.10.2004 (Чт) 12:22

хорошо я нашел нужный мне процессид и как мне из него получить хвнд???
или можно получить список всех хвнд процессов а по ним искать нужный???
This message will self destruct in five seconds!!!

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

Сообщение alibek » 14.10.2004 (Чт) 13:04

Ты опять не понял.
Ты берешь hWnd и смотришь, соответствует ли он тому ProcessID, что тебе нужен, или нет. А список окон получаешь EnumWindow(Ex).
Lasciate ogni speranza, voi ch'entrate.

Demonx
Бывалый
Бывалый
 
Сообщения: 237
Зарегистрирован: 25.06.2003 (Ср) 0:08
Откуда: Литва/Висагинас

Сообщение Demonx » 14.10.2004 (Чт) 13:44

Можете напситать код такой, чтобы например есть процесс "iexplorer.exe" и надо узнать его hwnd.
Изображение

iolaus
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 19.03.2002 (Вт) 18:33
Откуда: Москва

Сообщение iolaus » 14.10.2004 (Чт) 21:24

ну собственно я вот это и хотел написать!!! всё теперь понял, я и в прошляй раз понял просто не знал про енумвиндов!!! спасибо!!!
This message will self destruct in five seconds!!!

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

Сообщение tyomitch » 15.10.2004 (Пт) 9:13

Demonx писал(а):Можете напситать код такой, чтобы например есть процесс "iexplorer.exe" и надо узнать его hwnd.

Да на удовольствие! Совместимость: NT4+
Код: Выделить всё
Option Explicit

Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function NtQueryInformationProcess Lib "ntdll" (ByVal hProcess As Long, ByVal ProcessInformationClass As Long, ProcessInformation As Any, ByVal ProcessInformationLength As Long, ReturnLength As Long) As Long
Private Type PROCESS_BASIC_INFORMATION
    ExitStatus As Long
    PebBaseAddress As Long  'points to a structure too long to declare
    AffinityMask As Long
    BasePriority As Long
    UniqueProcessId As Long
    InheritedFromUniqueProcessId As Long
End Type
Private Type UNICODE_STRING
    Length As Integer
    MaximumLength As Integer
    Buffer As Long
End Type
Private Type RTL_USER_PROCESS_PARAMETERS
    MaximumLength As Long
    Length As Long
    Flags As Long
    DebugFlags As Long
    ConsoleHandle As Long
    ConsoleFlags As Long
    StdInputHandle As Long
    StdOutputHandle As Long
    StdErrorHandle As Long
    CurrentDirectoryPath As UNICODE_STRING
    CurrentDirectoryHandle As Long
    DllPath As UNICODE_STRING
    ImagePathName As UNICODE_STRING
    CommandLine As UNICODE_STRING
    Environment As Long
    StartingPositionLeft As Long
    StartingPositionTop As Long
    Width As Long
    Height As Long
    CharWidth As Long
    CharHeight As Long
    ConsoleTextAttributes As Long
    WindowFlags As Long
    ShowWindowFlags As Long
    WindowTitle As UNICODE_STRING
    DesktopName As UNICODE_STRING
    ShellInfo As UNICODE_STRING
    RuntimeData As UNICODE_STRING
    DLCurrentDirectory(1 To &H200) As Byte
End Type
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const PROCESS_VM_READ = &H10

Sub Main()
EnumWindows AddressOf EnumWindowsProc, 0
End Sub

Private Function EnumWindowsProc(ByVal hWnd As Long, ByVal lParam As Long) As Long
Dim PID As Long, hProcess As Long, pbi As PROCESS_BASIC_INFORMATION
Dim ProcessParameters As Long, upp As RTL_USER_PROCESS_PARAMETERS
Dim ImagePathName As String

GetWindowThreadProcessId hWnd, PID
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, PID)
If hProcess Then
    NtQueryInformationProcess hProcess, 0, pbi, Len(pbi), 0&
    ReadProcessMemory hProcess, pbi.PebBaseAddress + 16, ProcessParameters, 4, 0&
    ReadProcessMemory hProcess, ProcessParameters, upp, LenB(upp), 0&
    ImagePathName = String(upp.ImagePathName.Length \ 2, 0)
    ReadProcessMemory hProcess, upp.ImagePathName.Buffer, ByVal StrPtr(ImagePathName), LenB(ImagePathName), 0&
    CloseHandle hProcess
    If LCase(Right(ImagePathName, 12)) = "iexplore.exe" Then Debug.Print hWnd
End If
EnumWindowsProc = 1
End Function
Изображение

bevaine2000
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 15.04.2005 (Пт) 23:45

Сообщение bevaine2000 » 16.04.2005 (Сб) 0:06

пожалуйста объясните мне чайнику что и куда вставлять(что на форму, что в модуль)

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 16.04.2005 (Сб) 8:47

bevaine2000 писал(а):пожалуйста объясните мне чайнику что и куда вставлять(что на форму, что в модуль)

Всё в модуль формы.
В свойствах проекта выставь старт не с формы, а с процедуры Main и запускай.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

bevaine2000
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 15.04.2005 (Пт) 23:45

Сообщение bevaine2000 » 16.04.2005 (Сб) 14:36

Все, спасибо разобрался!


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

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

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

    TopList