С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 426

Узнать текст ToolTip-a контрола в чужом приложении ?

22.09.2017, 19:32. Показов 1318. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Чужое приложение (CorelDRAW), в нём есть до десятка контролов класса - "Edit", причем местоположение их совершенно разное у разных юзеров, workspace настраивается индивидуально, текст в них постоянно меняется в процессе работы с программой. Мне надо узнать hwnd одного из них, чтоб "вписывать" в него нужное мне число. Все hwnd нахожу (EnumChildWindow), "отфильтровываю" все класса "Edit", но не могу выделить нужный мне - не отличаются они ничем, не за что зацепиться. Но вот ToolTip-ы у них разные. Есть ли возможность получать текст ToolTip-а контрола при известном hwnd этого контрола?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.09.2017, 19:32
Ответы с готовыми решениями:

Как узнать состояние CheckBox в чужом окне
Привет! Подскажите, плз, как программно определить наличие галочки в чужом CheckBox %-)

Изменение подсказки ToolTip контрола во время выполнения
Как изменить подсказку ToolTip для button1 во время выполнения программы?

Изменение текста в ToolTip вместе с текстом контрола
Когда мышь задерживается на лейбле, показывается tooltip. Подсказка в tooltip - текст из самого лейбла. Но текст в лейбле все время...

13
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
22.09.2017, 21:01
Цитата Сообщение от giaber Посмотреть сообщение
текст ToolTip-а контрола при известном hwnd этого контрола?
ToolTip это по сути полноценное окно и для получения текста надо знать его whnd + id и из структуры TOOLINFO вытаскивать текст.
0
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 426
23.09.2017, 17:56  [ТС]
Спасибо, буду копать в эту сторону. А конкретных примерчиков не подбросите?
0
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 426
01.10.2017, 01:41  [ТС]
После ДОЛГИХ поисков накопал такое:
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
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageW" (ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Const TTM_GETTEXT As Long = &H438
'
Type rect
    Left    As Long
    Top     As Long
    Right   As Long
    Bottom  As Long
End Type
'
Type TOOLINFO
    cbSize  As Long
    uFlags  As Long
    hWnd    As Long
    uId     As Long
    rect    As rect
    hInst   As Long
    lpszText As Long
End Type
'
 
' get tooltip text from handle
Function GetTooltipText(ByVal hWnd As Long, ByVal hTooltip As Long) As String
    Dim ti As TOOLINFO, buffer As String
    ti.cbSize = Len(ti)
    ti.hWnd = hTooltip
    buffer = Space$(255)
    ti.lpszText = StrPtr(buffer)
    SendMessage hWnd, TTM_GETTEXT, 0, ti
    GetTooltipText = Trim$(buffer)
End Function
Но не могу попробовать, поскольку не понимаю что такое hTooltip в Function GetTooltipText(ByVal hWnd As Long, ByVal hTooltip As Long) As String

Думаю, что hWnd - это hWnd контрола, тултип которого мы пытаемся считать, надеюсь не ошибаюсь?

Мужики, кто понимает, проверьте, а? работает или нет?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
01.10.2017, 09:09
Попробуй через GetDlgCtrlID, у разных контролов он различается.
0
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 426
01.10.2017, 18:42  [ТС]
The Trick - спасибо за подсказку! GetDlgCtrlID работает, нужный мне контрол имеет уникальный ID и при повторных запусках CorelDraw ID нужного мне контрола не меняется, всё отлично, но!

есть один непонятный мне нюанс: этот ID конкретного Edit-контрола - у других, установивших CorelDraw, он будет таким же как и на моём компе или он присваивается контролу при установке CorelDraw, подобно тому, как при каждом запуске программы контролу присваивается новый hWnd, то есть если я в моей проге пропишу:
1. При помощи EnumChildWindow найти все дочерние класса Edit (6-10 штук)
2. выбрать из всех полученых Edit-контролов контрол с ID =1234567, запомнить его hWnd
3. при нажатии кнопки вписывать нужное мне число в Edit-контрол с этим hWnd

то будет ли это работать у людей установивших ту же версию CorelDraw, что и у меня?
0
193 / 191 / 31
Регистрация: 11.10.2016
Сообщений: 610
03.10.2017, 12:53
giaber, это вы всё с тем NudgeOffset'ом боретесь?
Любопытно, пользователю нужно будет несколько раз изменять его значение во время работы?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
03.10.2017, 13:51
Цитата Сообщение от giaber Посмотреть сообщение
то будет ли это работать у людей установивших ту же версию CorelDraw, что и у меня?
Не знаю. У CorelDraw есть поддержка COM, также там есть VBA. Попробуй там найти то что тебе нужно. Там можно сразу и свойства править объектов.
Пример:
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
Option Explicit
 
Private Sub Form_Load()
    Dim appCD   As CorelDRAW.Application
    Dim cmdBar  As VGCore.CommandBar
    Dim ctlIdx  As Long
    Dim ctl     As VGCore.Control
 
    Set appCD = GetObject("", "CorelDraw.Application")
    
    For Each cmdBar In appCD.CommandBars
        
        If cmdBar.Name = "Transform" Then
        
            For ctlIdx = 0 To cmdBar.Controls.Count - 1
                
                Set ctl = cmdBar.Controls(ctlIdx + 1)
                
                Debug.Print
                Debug.Print "Caption: "; ctl.Caption
                Debug.Print "DescriptionText: "; ctl.DescriptionText
                Debug.Print "ID: "; ctl.ID
                Debug.Print "Parameter: "; ctl.Parameter
                Debug.Print "Tag: "; ctl.Tag
                Debug.Print "ToolTipText: "; ctl.ToolTipText
                Debug.Print "Visible: "; ctl.Visible
                Debug.Print
 
            Next
            
        End If
        
    Next
    
End Sub
Вывод

Caption: Начальная точка объекта
DescriptionText: Задать использование контрольной точки во время позиционирования или масштабирования объекта.
ID: 3148e122-4f73-6e8a-4dfb-b2f6a84090d5
Parameter:
Tag:
ToolTipText: Задать использование контрольной точки во время позиционирования или масштабирования объекта.
Visible: True


Caption: Расположить
DescriptionText: Расположить объект на странице, указав его координаты X и Y.
ID: a41164ff-c9e9-4b2c-954a-095f4204538e
Parameter:
Tag:
ToolTipText: Расположить объект на странице, указав его координаты X и Y.
Visible: True


Caption: Разделитель
DescriptionText:
ID: 266435b4-6e53-460f-9fa7-f45be187d400
Parameter:
Tag:
ToolTipText:
Visible: True


Caption: Размер
DescriptionText: Задать высоту объекта.
ID: 325d7c86-da3a-4610-bd25-5cf98cf66a41
Parameter:
Tag:
ToolTipText: Задать высоту объекта.
Visible: True


Caption: Масштаб
DescriptionText: Указать новый масштаб объекта в процентах.
ID: 42bef211-16e5-4b4f-b9ee-52b7b5476232
Parameter:
Tag:
ToolTipText: Указать новый масштаб объекта в процентах.
Visible: True


Caption: Пропорциональное отношение
DescriptionText: Cохранять исходное соотношение ширины и высоты при масштабировании объекта.
ID: d289f32b-3808-4510-b892-fd2cb0820209
Parameter:
Tag:
ToolTipText: Cохранять исходное соотношение ширины и высоты при масштабировании объекта.
Visible: True


Caption: Разделитель
DescriptionText:
ID: 266435b4-6e53-460f-9fa7-f45be187d400
Parameter:
Tag:
ToolTipText:
Visible: True


Caption: Угол
DescriptionText: Задать угол поворота объекта.
ID: 8723ad52-3e31-473c-8756-7ae85abcc483
Parameter:
Tag:
ToolTipText: Задать угол поворота объекта.
Visible: True


Caption: Центр вращения
DescriptionText: Расположить центр вращения, указав его координаты X и Y.
ID: 067af1c1-d607-4674-aa31-ba3e8726c366
Parameter:
Tag:
ToolTipText: Расположить центр вращения, указав его координаты X и Y.
Visible: True


Caption: Разделитель
DescriptionText:
ID: 266435b4-6e53-460f-9fa7-f45be187d400
Parameter:
Tag:
ToolTipText:
Visible: True


Caption: Отразить по горизонтали
DescriptionText: Перевернуть объект слева направо.
ID: e6644135-9dab-4935-8ab9-fc85527810ca
Parameter:
Tag:
ToolTipText: Перевернуть объект слева направо.
Visible: True


Caption: Отразить по вертикали
DescriptionText: Перевернуть объект сверху вниз.
ID: 6ae897fd-2eab-4dad-b172-f4fb768c273e
Parameter:
Tag:
ToolTipText: Перевернуть объект сверху вниз.
Visible: True


Caption: Разделитель
DescriptionText:
ID: 266435b4-6e53-460f-9fa7-f45be187d400
Parameter:
Tag:
ToolTipText:
Visible: True


Caption: Наклон
DescriptionText: Наклонить объект по горизонтали или по вертикали, указав угол наклона.
ID: 6655110e-ccd2-4020-a768-86a5d1b34136
Parameter:
Tag:
ToolTipText: Наклонить объект по горизонтали или по вертикали, указав угол наклона.
Visible: True


Caption: Разделитель
DescriptionText:
ID: 266435b4-6e53-460f-9fa7-f45be187d400
Parameter:
Tag:
ToolTipText:
Visible: True


Caption: Применение для дубликата
DescriptionText: Применить преобразование к дубликату объекта.
ID: e7cec14f-a6a9-424a-98d5-7137eeeb974f
Parameter:
Tag:
ToolTipText: Применить преобразование к дубликату объекта.
Visible: True


Caption: Разделитель
DescriptionText:
ID: 266435b4-6e53-460f-9fa7-f45be187d400
Parameter:
Tag:
ToolTipText:
Visible: True


Caption: Относительно объекта
DescriptionText: Применить преобразование в соответствии с позицией объекта, а не его координатами X и Y.
ID: 249bae0e-dda5-489e-9c5f-ca0a3d53213c
Parameter:
Tag:
ToolTipText: Применить преобразование в соответствии с позицией объекта, а не его координатами X и Y.
Visible: True


0
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 426
05.10.2017, 14:59  [ТС]
The trick - это именно то, что мне нужно!, но никак не смог запустить ни в VB6 ни в самом кореловском VBA - на все объявления выдаёт User-defined type not defined. Я понимаю, что такой уровень ламерности вообще выходит за все рамки, но может вы подскажете мне как мне это дело запустить.
0
193 / 191 / 31
Регистрация: 11.10.2016
Сообщений: 610
05.10.2017, 16:20
giaber, я ради любопытства тоже проверил код от The trick. На англоязычном 13-м Кореле все запустилось, правда, при этом создавался объект также установленного 16-го Корела с русскоязычными заголовками и ToolTip'ами. Вам всего лишь нужно в Reference подключить Кореловскую библиотеку с типом VGCore

Кстати, вы так и не ответили на мой вопрос
0
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 426
05.10.2017, 23:26  [ТС]
shark, извините меня, через 2-3 часа освобожусь, отвечу

Добавлено через 6 часов 20 минут
giaber, это вы всё с тем NudgeOffset'ом боретесь?
С ним, супостатом! Но сильно урывками, занят сильно

Любопытно, пользователю нужно будет несколько раз изменять его значение во время работы?
Не совсем понял вашу формулировку, если слово "нужно" заменить на "можно" - тогда понятно, ну да не суть.
Я по своему "стилю" работы в кореле часто использую 4 величины NudgeOffset - 1мм, 0,1мм, 0,01мм и 0,001мм, набирать каждый раз эти числа-лень. Ну вот я и захотел сделать четыре кнопки, которые будут устанавливать соответствующие величины NudgeOffset. Это несложно в варианте "для себя". Но потом я подумал, что многие выкладывают бесплатно достаточно сложные макросы, я ими пользуюсь, давай и я "отплачу добром" и сделаю макрос пусть и примитивный, но может кому понадобится. Отсюда и возникла проблема идентификации этого поля ввода NudgeOffset на "любом" компе.
К тому же по размышлении я осознал, что у других пользователей могут быть свои "любимые" величины NudgeOffset. так что сейчас буду делать вариант, в котором можно "цеплять" на кнопки произвольные значения, и до следующего изменения пользователем при нажатии на конкретную кнопку в поле NudgeOffset будет устанавливаться назначенное этой кнопке значение. Вопросы встают дурацкие - к примеру, не могу решить - делать отдельное кнопки или выпадающее меню.
Но всё это мелочи, главное -идентификация Edit-контрола на разных компах, да ещё чтоб работало и в 32битном и в 64битном варианте.
А вы, shark, интересуетесь потому что вам тоже управление NudgeOffset-ом в работе в Кореле не помешало бы? Может есть какие интересные идеи с расширением функционала такого макроса? А то я в Кореле так же как и в программировании - фантастический ламер!
-------------------
Подключил библиотеки - на CorelDRAW19 всё заработало (ну ещё бы! - The trick туфту не посоветует!)
Завтра попытаюсь искать этим методом свой Edit-контрол
0
193 / 191 / 31
Регистрация: 11.10.2016
Сообщений: 610
06.10.2017, 09:55
Цитата Сообщение от giaber Посмотреть сообщение
А вы, shark, интересуетесь потому что вам тоже управление NudgeOffset-ом в работе в Кореле не помешало бы? Может есть какие интересные идеи с расширением функционала такого макроса?
Не сказать, что очень уж нужен этот NudgeOffset, мне хватает стандартных возможностей. Начальное значение можно выставить через реестр, при старте Корела оно сразу подставится. А дополнительные варианты могут быть реализованы тоже стандартными средствами, путем установки делителя. В этом случае объекты можно перемещать стрелками при нажатии Shift'а или Ctrl'а. То есть, поставили начальное значение 0,1 и делитель на 10. При нажатом Ctrl'е объекты будут перемещаться на 0,01, при нажатом Shift'е - на 1мм.
0
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 426
06.10.2017, 10:50  [ТС]
Ну, не спорно, конечно - у каждого свои привычки работы. Я пробовал так, как вы говорите - мне всё равно как-то слегка дискомфортно. Вообще-то и мне этот NudgeOffset не так чтобы очень уж нужен, но как-то втянулся и уже принципиально хочу добить. Начиная, думал что раз-раз и минут за 5-10 напишу макрос, а тут вона какие загогулины выскочили - нового много для меня!
0
193 / 191 / 31
Регистрация: 11.10.2016
Сообщений: 610
06.10.2017, 11:00
как вариант, можно еще перехватывать клавиатурные нажатия на стрелки через SetWindowsHookEx. Я так пробовал сделать выравнивание узлов через клавиши L, R.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.10.2017, 11:00
Помогаю со студенческими работами здесь

Нажать кнопку в чужом приложении
Помогите нажать кнопку на "левом" приложение !!!!!

Отлов сообщений в чужом приложении
Доброго. Начал изучать cpp, но так как имхо быстрое изучение - практика то решил чо нить написать... Так как все самое нужное и...

Нажатие на кнопку в чужом приложении
Всем доброго времени суток. Мне нужно нажать на кнопку в чужом приложении и вставить текст в поле. Через Spy++ я получаю название окна и...

Рисование в чужом полноэкранном приложении
Есть игра, запущенная на весь экран. Надо нарисовать некий текст в углу экрана, возможно ли это сделать, если имеются права администратора?...

Нажатие кнопки в чужом приложении
Здравствуйте. Задался целью программно нажать на кнопку в чужой программе. using System; using System.Collections.Generic; using...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru