API32 - Поиск объекта

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

API32 - Поиск объекта

Сообщение claymen » 26.10.2006 (Чт) 15:24

Подскажите, как с помощью WinAPI найти в окне (ну например form1) все объекты (ну например label1, text1, image1) и изменить их (ну например поменять содержимое label1, или вставить в поле text1 свой текст)

P.S. С API я только знакомлюсь, и пока изучил только:
Код: Выделить всё
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
и начинали мы все чайниками, но потом...

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 26.10.2006 (Чт) 15:30

FindWindow
Но он не ищет label и image.
И вообще, найти VB'шные label и image на форме с помощью API будет мягко говоря проблематично.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 26.10.2006 (Чт) 17:45

ANDLL писал(а):FindWindow


Гм. Вообще-то FindWindowEx/EnumChildWindows
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 26.10.2006 (Чт) 18:26

у меня следующие вопросы:
в функции FindWindowEx мне не понятны следующие аргументы:
ByVal lpsz1 As String и ByVal lpsz2 As String
Что они означают?
Если я правильно понимаю, то искать в чужом окне программы label нужно следующим образом:
Код: Выделить всё
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
   
Private Sub Form_Load()
    'Ищем handle окна
    tWnd = FindWindow(vbNullString, "Form1")
    'Ищем handle лабела в этом окне
    bWnd = FindWindowEx(tWnd, ByVal 0&, "LABEL", vbNullString)
End Sub

Но почемуто bWnd всегда равен 0. А это значит, что handle лабела не найден! Блин все эти API - такая жуть...;)

Если кто знает, подскажите как?
и начинали мы все чайниками, но потом...

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 26.10.2006 (Чт) 19:03

вот я сейчас дошел вот до чего:
Код: Выделить всё
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
   
Private Sub btnOK_Click()
    'Поиск handle нужного окна
    tWnd = FindWindow(vbNullString, "Form1")
    'Поиск handle элемента в нужном окне (кнопки с надмисью 'OK')
    bWnd = FindWindowEx(tWnd, ByVal 0&, vbNullString, "OK")
    'Ура! Оба хэндла найдены
    'Теперь будем искать handle элемента (лабела с надпись 'This is label')
    bWnd = FindWindowEx(tWnd, ByVal 0&, vbNullString, "This is label")
    'А вот и фиг. Не находит зараза ;((
End Sub

Так почему handle лабела не могу найти?
Я так понял, что lpsz1 из ByVal lpsz1 As String - это некий описатель* элементов окна (Button, Label, Checkbox и т.д.)
А lpsz2 из ByVal lpsz2 As String - это текст, присвоенный этому элементу. Если это так, то где можно найти список описателей lpsz1.

Ну блин, мне что до всего самому доходить. Или кто нибуть поможет-то
А?
и начинали мы все чайниками, но потом...

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 26.10.2006 (Чт) 19:12

claymen
Я вроде бы говорил, что label так найти нельзя. Или не читаем?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 26.10.2006 (Чт) 19:39

claymen писал(а):у меня следующие вопросы:
в функции FindWindowEx мне не понятны следующие аргументы:
ByVal lpsz1 As String и ByVal lpsz2 As String
Что они означают?


MSDN рулит

claymen писал(а):Если я правильно понимаю, то искать в чужом окне программы label нужно следующим образом


OMG. Label - не окно.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 26.10.2006 (Чт) 19:46

ANDLL
Ну тогда может ты мне подскажешь, как найти handle лабела.
И если я нашел handle кнопки "Command1", то какие действия я могу с нею проводить (и как это делать).
и начинали мы все чайниками, но потом...

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 26.10.2006 (Чт) 19:52

Ну тогда может ты мне подскажешь, как найти handle лабела
А какой handle тебе нужен?
Если hWnd, то у VBшного label его нету.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 26.10.2006 (Чт) 22:03

И если я нашел handle кнопки "Command1", то какие действия я могу с нею проводить (и как это делать).
Может ты скажешь, какие действия нужно проводить с кнопкой? А мы подскажем как. В основном "как" - SendMessage.
Лучший способ понять что-то самому — объяснить это другому.

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 27.10.2006 (Пт) 7:13

Antonariy
Ладно, черт с этой кнопкой. Лучше подскажи как мне найти лабел.
и начинали мы все чайниками, но потом...

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

Сообщение alibek » 27.10.2006 (Пт) 7:19

Из внешней программы ты его не найдешь.
Изнутри проще всего пользоваться перебором Controls.
Lasciate ogni speranza, voi ch'entrate.

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 27.10.2006 (Пт) 8:21

alibek
Ну а как же тогда эту операцию делает программа Multilizer?
Я бы в принципе исспользовал ее, но мне нужно отдельно!
и начинали мы все чайниками, но потом...

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 27.10.2006 (Пт) 8:25

Да, кстати, если кто хнает, где достать описание SendMessage
на Руском языке - подскажите plz.
MSDN - не предлогать!
и начинали мы все чайниками, но потом...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 27.10.2006 (Пт) 8:46

claymen писал(а):Да, кстати, если кто хнает, где достать описание SendMessage
на Русcком языке - подскажите plz.
MSDN - не предлагать!


Имеется куча литературы на русском языке, где вполне можно найти описание как SendMessage, так и других функций API, поиск весьма рулит. В первую очередь стоит несомненно вспомнить Аппельмана. Ну и все же MSDN остается наилучшим источником знаний по API функциям...

З.Ы. Английский язык в объеме необходимом для чтения MSDN надо таки стараться изучать по мере сил и возможностей.
Весь мир матрица, а мы в нем потоки байтов!

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 27.10.2006 (Пт) 8:48

Вот, держи, вроде тут все понятно написано. А вообще, пользуйся поиском, тут эту функцию не раз обсуждали.
Функция SendMessage
Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal Msg As Long, wParam As Any, lParam As Any) As Long

Платформа

Windows 95/98: Поддерживается.
Windows NT: Требуется Windows NT 3.1 или выше.
Windows 2000: Поддерживается.
Windows CE: Требуется Windows CE 1.0 или выше.

SendMessage посылает сообщение окну. Функция вызывает оконную процедуру для обработки сообщения. Эта функция не возвращается, пока окно не завершит обработку сообщения.

Возвращаемое значение
Функция возвращает значение сообщения.
Параметры


hWnd
Дескриптор окна,в которое будет послано сообщение.
Msg
Идентификатор сообщения.
wParam
Дополнительные определенные данные сообщения.
lParam
Дополнительные определенные данные сообщения.

Константы


Const WM_SYSCOMMAND = &H112
Const SC_SCREENSAVE = &HF140&

Пример

' Запускаем хранитель экрана

SendMessage hwnd, WM_SYSCOMMAND, SC_SCREENSAVE, ByVal 0&



Какие бывают сообщения - будет тебе заданием для самостоятельного изучения. :)
Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 27.10.2006 (Пт) 9:52

Oxygen
Твой пример вызывает ошибку "Overflow"
и начинали мы все чайниками, но потом...

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 27.10.2006 (Пт) 10:00

Oxygen
Твой пример вызывает ошибку "Overflow"
И на сколько я понял, функция декларируется не так:
Код: Выделить всё
Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal Msg As Long, wParam As Any, lParam As Any) As Long

А вот так:
Код: Выделить всё
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Any) As Long
и начинали мы все чайниками, но потом...

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 27.10.2006 (Пт) 10:04

Это не пример. Это вырезка из справочника по API. А можно узнать, как ты его используешь? Потому как переполнение он впринципе не должен вызывать.
Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 27.10.2006 (Пт) 10:08

Oxygen
Все очень просто, вот так:
Код: Выделить всё
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Any) As Long
Const WM_SYSCOMMAND = &H112
Const SC_SCREENSAVE = &HF140&

Private Sub Form_Load()
    SendMessage hwnd, WM_SYSCOMMAND, SC_SCREENSAVE, ByVal 0&
End Sub
и начинали мы все чайниками, но потом...

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 27.10.2006 (Пт) 10:09

на сколько я понял, функция декларируется не так
API функции деклалируются так, как того хочется автору. (При этом, правда, надо соблюдать некоторые правила. Но конкретно втом случае они соблюдены)
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 27.10.2006 (Пт) 10:09

!Viper!
На счет Аппельмана - это наверное такой автор книги по API?
Может подскажешь. где его достать в сети, и как точно называется его книга.
и начинали мы все чайниками, но потом...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 27.10.2006 (Пт) 12:04

claymen писал(а):Oxygen
Твой пример вызывает ошибку "Overflow"
И на сколько я понял, функция декларируется не так:
Код: Выделить всё
Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal Msg As Long, wParam As Any, lParam As Any) As Long

А вот так:
Код: Выделить всё
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Any) As Long


вот как раз твой вариант объявления некорректен, ибо wParam и lParam должны быть объявлены либо As Any, либо As Long, но уж никак не As Integer.

З.Ы. Книга называется Win 32 API и Visual Basic. автор Дэн Эпплман (Dan Appleman). google тебе в помощь
Весь мир матрица, а мы в нем потоки байтов!


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

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

Сейчас этот форум просматривают: Google-бот, Majestic-12 [Bot], SemrushBot и гости: 113

    TopList