Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/16: Рейтинг темы: голосов - 16, средняя оценка - 4.75
 Аватар для edward_freedom
1569 / 1448 / 303
Регистрация: 01.10.2011
Сообщений: 2,636
.NET 4.x

Не получается найти дескриптор окна с одинаковым классом

22.04.2012, 16:50. Показов 3184. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Знаю, что нужно смотреть в сторону EnumChildWindows, но что то у меня не получаеться. Вот скриншот
Миниатюры
Не получается найти дескриптор окна с одинаковым классом  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.04.2012, 16:50
Ответы с готовыми решениями:

Не получается найти дескриптор запущенного окна
открываю процесс с помощью функции CreateProcess(), далее пытаюсь определить дескриптор окна нового процесса FindWindowEx(), но не могу...

Нужно получить дескриптор окна имея дескриптор контрола
Нужно получить дескриптор окна имея дескриптор контрола, подскажите как

С помощью WinApi функции найти дескриптор окна
static extern IntPtr FindWindow ( string lpClassName, string lpWindowName ); static extern int gwt ( ...

7
 Аватар для PAnT0P
1492 / 587 / 107
Регистрация: 26.03.2012
Сообщений: 1,039
22.04.2012, 16:58
А код где?
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
22.04.2012, 16:59
Хм, не очень понятно - ты пытаешься получить в открытом браузере Опера дескриптор флеш-проигрывателя?
0
 Аватар для edward_freedom
1569 / 1448 / 303
Регистрация: 01.10.2011
Сообщений: 2,636
22.04.2012, 17:23  [ТС]
Я пытаюсь переделать код с Autoit"а
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Func _getControlsId($titl, $xSize, $ySize $flag=0)
    Local $ctrl_list = _WinAPI_EnumChildWindows(WinGetHandle($titl), 0), $return[2]
    If IsArray($ctrl_list) Then
        For $i = 1 To $ctrl_list[0][0]
            $hPos = ControlGetPos('','',$ctrl_list[$i][0])
            If $hPos[2] = $xSize And $hPos[3] = $ySize Then
                Local $NN = 1
                For $ii = 1 To $ctrl_list[0][0]
                    If $ctrl_list[$ii][1] = $ctrl_list[$i][1] Then
                        If $ctrl_list[$ii][0] = $ctrl_list[$i][0] Then ExitLoop
                        $NN += 1
                    EndIf
                Next
                $return[0] = $ctrl_list[$i][1]&$NN
                $return[1] = $ctrl_list[$i][0]
                Return $return
            EndIf
        Next
    EndIf
EndFunc
Смысл кода как обьясняет автор
Работая с флеш приложениями, многие сталкиваются с проблемой определения хендла приложения. Стандартная процедура через ControlGetHandle ( "title", "text", controlID ) не всегда работает, потому, что в зависимости от количества флеш элементов на странице, класс нужного нам приложения меняется(MacromediaFlashPlayerActiveX1, MacromediaFlashPlayerActiveX2, MacromediaFlashPlayerActiveX...nn...). А флеш банеры часто появляются и исчезают на одной и той же странице, не давая тем самым определить класс раз и навсегда, не говоря уж о том, что для разных браузеров классы разные.
Изначально для обхода этой проблемы я использовал физический клик мышью(т.е. на какое то время скрипт овладевал грызуном), что я считал не совсем приемлемым. Предлагаю вашему вниманию функцию, которая возвращает массив содержащий класс и хендл искомого приложения, используя для этого титл и размер элемента(не думаю что на оной странице будет несколько флешек одинакового размера).
Вот мой код, он работает, но через раз, потому что меняеться класс
VB.NET
1
2
3
4
5
6
7
8
9
Dim _e1, _e2, _e3, _e4, _e5, _e6 As Integer
        Dim className As New StringBuilder(255)
        GetClassName(FindWindow(vbNullString, "ВКонтакте | Легенда"), className, className.Capacity)
_e1 = FindWindow(vbNullString, "ВКонтакте | Легенда")
        _e2 = FindWindowEx(_e1, vbNullString, className.ToString, vbNullString)
        _e3 = FindWindowEx(_e2, vbNullString, "Shell Embedding", vbNullString)
        _e4 = FindWindowEx(_e3, vbNullString, "Shell DocObject View", vbNullString)
        _e5 = FindWindowEx(_e4, vbNullString, "Internet Explorer_Server", vbNullString)
        _e6 = FindWindowEx(_e5, vbNullString, "MacromediaFlashPlayerActiveX", vbNullString)
0
Крутой форумчанин
154 / 154 / 8
Регистрация: 09.01.2011
Сообщений: 298
23.04.2012, 13:15
Заинтересовал твой вопрос.

Вот, переделал чуток пример с MSDN-а.
tvWindows - это TreeView.
В переменной Node хранится текущий нод родителя для потомков.
Дальше, думаю, сам разберёшься, добавишь функцию которая выдёргивает класс по hwnd и т.д.

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Public Class frmMain
    Public Delegate Function CallBack(hWnd As Integer, lParam As Integer) As Boolean
    Public Declare Function EnumWindows Lib "user32" (x As CallBack, lParam As Integer) As Integer
    Public Declare Function EnumChildWindows Lib "user32" (hWndParent As System.IntPtr, x As CallBack, lParam As Integer) As Integer
    Private Node As TreeNode
 
    Public Function ReportMain(hwnd As Integer, lParam As Integer) As Boolean
        Node = tvWindows.Nodes.Add(hwnd)
        EnumChildWindows(hwnd, AddressOf ReportChild, 0)
        Return True
    End Function
 
    Public Function ReportChild(hWnd As Integer, lParam As Integer) As Boolean
        Node.Nodes.Add(hWnd)
        Return True
    End Function
 
    Private Sub frmMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        EnumWindows(AddressOf ReportMain, 0)
    End Sub
End Class
Добавлено через 5 минут
Я правда что-то затупил - не пойму, как сделать чтобы не два уровня было, а "глубже".

Добавлено через 2 минуты
Если бы в CallBack функцию можно было TreeNode передать - тогда вроде понятно. Блин. Что-то очевидное должно быть, но тут нужен капитан.

Добавлено через 39 минут
Разобрался как класс окна получить:
VB.NET
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
Imports System.Text
Imports System.Runtime.InteropServices
 
Public Class frmMain
    'пришлось объявлять функцию как-то по извращенчески, но главное работает. Видимо из-за кодировки
    <DllImport("user32.dll", CharSet:=CharSet.Ansi)> _
    Private Shared Function GetClassName(ByVal hWnd As System.IntPtr, ByVal lpClassName As System.Text.StringBuilder, ByVal nMaxCount As Integer) As Integer
    End Function
 
    Private Delegate Function CallBack(hWnd As Integer, lParam As Integer) As Boolean
    Private Declare Function EnumWindows Lib "user32" (CallBackFunction As CallBack, lParam As Integer) As Integer
    Private Declare Function EnumChildWindows Lib "user32" (hWndParent As System.IntPtr, CallBackFunction As CallBack, lParam As Integer) As Integer
    Private Node As TreeNode
 
    Public Function ReportWindow(hWnd As Integer, lParam As Integer) As Boolean
        Dim sClassName As New StringBuilder("", 256)
        GetClassName(hWnd, sClassName, sClassName.Capacity)
        Node = tvWindows.Nodes.Add(hWnd & " : " & sClassName.ToString)
        Return True
    End Function
 
    Private Sub frmMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        EnumWindows(AddressOf ReportWindow, 0)
    End Sub
End Class
1
 Аватар для edward_freedom
1569 / 1448 / 303
Регистрация: 01.10.2011
Сообщений: 2,636
23.04.2012, 23:14  [ТС]
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

cergew, Спасибо большое, это то что нужно!

Добавлено через 1 час 33 минуты
Вот с моими изменениями

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public Delegate Function CallBack(hWnd As Integer, lParam As Integer) As Boolean
    Public Declare Function EnumWindows Lib "user32" (x As CallBack, lParam As Integer) As Integer
    Public Declare Function EnumChildWindows Lib "user32" (hWndParent As System.IntPtr, x As CallBack, lParam As Integer) As Integer
    Dim list As New ArrayList()
 
 
    Public Function ReportMain(hwnd As Integer, lParam As Integer) As Boolean
        EnumChildWindows(FindWindow(vbNullString, "ВКонтакте | Легенда"), AddressOf ReportChild, 0)
        Return True
    End Function
 
    Public Function ReportChild(hWnd As Integer, lParam As Integer) As Boolean
        list.Add(hWnd)
        Return True
    End Function
VB.NET
1
2
3
4
5
6
7
8
9
10
11
 For i = 0 To list.Count - 1
            Dim размер As RECT
            GetWindowRect(list.Item(i).ToString, размер)
            Dim ширина As Integer = размер.Right - размер.Left
            Dim высота As Integer = размер.Bottom - размер.Top
            If ширина = 730 And высота = 730 Then
                '
            End If
            ListBox1.Items.Add(list.Item(i) & ", " & размер.Right - размер.Left & ", " & размер.Bottom - размер.Top)
 
        Next
2
Крутой форумчанин
154 / 154 / 8
Регистрация: 09.01.2011
Сообщений: 298
24.04.2012, 00:00
Что-то злодейское пишет))
1
0 / 0 / 0
Регистрация: 14.04.2015
Сообщений: 1
14.04.2015, 15:07
Здравствуйте, уважаемые форумчане! Возможно, кому-то мой вопрос покажется глупым, но не мог бы кто-нибудь подсказать вариант кода для отображения полученной с помощью EnumChildWindows информации, скажем, в RichTextBox?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.04.2015, 15:07
Помогаю со студенческими работами здесь

Как найти дескриптор действительно активного окна?
Я поясню. Запускаю: #include &lt;windows.h&gt; #include &lt;stdio.h&gt; int main () { while (1) { Sleep (1000); printf...

Наведение на блоки с одинаковым классом
Сделал подмену картинок с одной на другую,но блоки у меня с одинаковым названием и заменяются во всех блоках. Как сделать чтобы делась...

Не сколько блоков с одинаковым классом
Привет всем, как сделать нескольким блокам с одинаковым классом пример : чтобы display:block; был только первый блок всегда? остальные...

Отправка форм с одинаковым классом
Приветствую всех. Есть несколько форм с одинаковым классом, в процессе понял что задать для каждого id и при этом делать кучу дубля кода js...

Перерисовка окна другого процесса через дескриптор этого окна
Приветствую всех. Может кто-то знает, как перерисовать окно другого процесса через дескриптор (IntPtr) этого окна. Может апишная функция...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru