Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.58/50: Рейтинг темы: голосов - 50, средняя оценка - 4.58
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19

Как получить Handle элемента управления пользовательской формы?

04.09.2014, 11:54. Показов 11009. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Коллеги, привет !!!

недавно столкнулся с тем, что невозможно нормально получить hWnd контрола... в среде VBA

например, я знаю как получить описатель с помощю FindWindow(vbNullString, me.Caption)

но этого недостаточно, надо получить описатель контрола...

напртимер, я забросил некий контрол, и пытаюсь получить hWnd_Txt= FindWindowEx (hWnd, 0 "Trunder.."

не могу понять, что требуется, в VB6 такой проблемы нет, там это есть в свойствах почти любого
контрола

помогите вот с чем, ... как получить описатели разных контролов, (очень нужно)

Добавлено через 35 минут
Наверное зря спросил, врят-ли кто сможет ответить
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.09.2014, 11:54
Ответы с готовыми решениями:

Свойства и методы элементов управления для пользовательской формы.
Помогите, пожалуйста, составить программу, выводящую на экран пользовательскую форму, на которой расположены поле со списком, содержащее...

Перенос текста из элемента управления одной формы на элемент управления другой
Здрасте, нужна помощь!) Мне нужно чтобы когда я ввожу в поле Text какую либо запись в одной форме и при нажатии на кнопку оно...

Как запретить закрытие пользовательской формы
Приветствую всех знатоков! у меня 2 вопроса: 1 - каким образом сделать UserForm1 незакрывающуюся? То есть чтобы на форме...

21
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
05.09.2014, 14:56  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от The trick Посмотреть сообщение
Удачи в обработке событий.
Цитата Сообщение от Антихакер32 Посмотреть сообщение
Можно собственно вот как сделать
создать несколько классов, в которых будут реализованны события и свойства
компонентов, события отлавливать через хуки.. и посылать сообщения через PostMessage

Короче, смотри прикол ! ✰



Модуль 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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
''©©©©©©©©©©©©©©©©©©© Список классов Window ©©©©©©©©©©©©©©©©©
''©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©
''Имя класса
''---------
''BUTTON
 
''COMBOBOX
 
''EDIT
 
''LISTBOX
 
''MDICLIENT
 
''RICHEDIT
 
''RICHEDIT_CLASS
 
''SCROLLBAR
 
''STATIC
Option Explicit
Public Declare Function RegisterClass Lib "user32" Alias "RegisterClassA" (Class As WNDCLASS) As Long
Public Declare Function UnregisterClass Lib "user32" Alias "UnregisterClassA" (ByVal lpClassName As String, ByVal hInstance As Long) As Long
Public Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" (ByVal hInstance As Long, ByVal lpCursorName As Any) As Long
Public Declare Function LoadIcon Lib "user32" Alias "LoadIconA" (ByVal hInstance As Long, ByVal lpIconName As String) As Long
Public Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
'нет описания
Public Declare Function GetMessage Lib "user32" Alias "GetMessageA" (lpMsg As Msg, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As Long
Public Declare Function TranslateMessage Lib "user32" (lpMsg As Msg) As Long
Public Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA" (lpMsg As Msg) As Long
Public Declare Sub PostQuitMessage Lib "user32" (ByVal nExitCode As Long)
 
Public Type WNDCLASS
    style As Long
    lpfnwndproc As Long
    cbClsextra As Long
    cbWndExtra2 As Long
    hInstance As Long
    hIcon As Long
    hCursor As Long
    hbrBackground As Long
    lpszMenuName As String
    lpszClassName As String
End Type
 
Public Type POINTAPI
    x As Long
    y As Long
End Type
 
Public Type Msg
    hwnd As Long
    message As Long
    wParam As Long
    lParam As Long
    time As Long
    pt As POINTAPI
End Type
Public Const CS_VREDRAW = &H1
Public Const CS_HREDRAW = &H2
Public Const CW_USEDEFAULT = &H80000000
Public Const ES_MULTILINE = &H4&
Public Const WS_BORDER = &H800000
Public Const WS_CHILD = &H40000000
Public Const WS_OVERLAPPED = &H0&
Public Const WS_CAPTION = &HC00000 'WS_BORDER Or WS_DLGFRAME
Public Const WS_SYSMENU = &H80000
Public Const WS_THICKFRAME = &H40000
Public Const WS_MINIMIZEBOX = &H20000
Public Const WS_MAXIMIZEBOX = &H10000
Public Const WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or WS_THICKFRAME _
Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX)
Public Const WS_EX_CLIENTEDGE = &H200&
Public Const COLOR_WINDOW = 5
Public Const WM_DESTROY = &H2
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const IDC_ARROW = 32512&
Public Const IDI_APPLICATION = 32512&
Public Const GWL_WNDPROC = (-4)
Public Const SW_SHOWNORMAL = 1
Public Const MB_OK = &H0&
Public Const MB_ICONEXCLAMATION = &H30&
Public Const gClassName = "MyClassName"
Public Const gAppName = "VBA-Проект: Создание формы при помощи API"
Public gButOldProc As Long ''Will hold address of the old window proc for the button
Public gHwnd As Long, gButtonHwnd As Long, gEditHwnd As Long ''You don't necessarily need globals, _
but if you're planning to gettext and stuff, then you're gona have to store the hwnds.
 
Public Sub Main()
    Dim wMsg As Msg
    'Регистрируем имя класса окна. В случае ошибки выходим
    If RegisterWindowClass = False Then Exit Sub
    'Создаем окно
    If CreateWindows Then
        ''Loop will exit when WM_QUIT is sent to the window.
        Do While GetMessage(wMsg, 0&, 0&, 0&)
            ''TranslateMessage takes keyboard messages and converts
            ''them to WM_CHAR for easier processing.
            Call TranslateMessage(wMsg)
            ''Dispatchmessage calls the default window procedure
            ''to process the window message. (WndProc)
            Call DispatchMessage(wMsg)
        Loop
    End If
    Call UnregisterClass(gClassName$, Application.hInstance)
End Sub
 
Public Function RegisterWindowClass() As Boolean
    Dim wc As WNDCLASS
    'Регистрируем новое окно
    wc.style = CS_HREDRAW Or CS_VREDRAW
    wc.lpfnwndproc = GetAddress(AddressOf WndProc) ''Address in memory of default window procedure.
    wc.hInstance = Application.hInstance
    wc.hIcon = LoadIcon(0&, IDI_APPLICATION) 'значок по умолчанию
    wc.hCursor = LoadCursor(0&, IDC_ARROW) 'стандартный курсор
    wc.hbrBackground = COLOR_WINDOW 'стандартный цвет окна
    wc.lpszClassName = gClassName$
    RegisterWindowClass = RegisterClass(wc) <> 0
End Function
 
Public Function CreateWindows() As Boolean
    'Создаем само окно формы
    gHwnd& = CreateWindowEx(0&, gClassName$, gAppName$, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, _
    CW_USEDEFAULT, 500, 190, 0&, 0&, Application.hInstance, ByVal 0&)
    'Создаем окно-кнопку
    gButtonHwnd& = CreateWindowEx(0&, "Button", "Нажми", WS_CHILD, 190, 95, 125, 40, gHwnd&, 0&, _
    Application.hInstance, 0&)
    'Создаем текстовое поле с окантовкой (WS_EX_CLIENTEDGE) и мультистрочным (ES_MULTILINE)
    gEditHwnd& = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", "Это текстовое поле." & vbCrLf & "Оно многострочное.", _
    WS_CHILD Or ES_MULTILINE, 50, 5&, 400, 80, gHwnd&, 0&, Application.hInstance, 0&)
    ''Since windows are hidden, show them. You can use UpdateWindow to
    ''redraw the client area.
    Call ShowWindow(gHwnd&, SW_SHOWNORMAL)
    Call ShowWindow(gButtonHwnd&, SW_SHOWNORMAL)
    Call ShowWindow(gEditHwnd&, SW_SHOWNORMAL)
    ''Get the memory address of the default window
    ''procedure for the button and store it in gButOldProc
    ''This will be used in ButtonWndProc to call the original
    ''window procedure for processing.
    gButOldProc& = GetWindowLong(gButtonHwnd&, GWL_WNDPROC)
    ''Set default window procedure of button to ButtonWndProc. Different
    ''settings of windows is listed in the MSDN Library. We are using GWL_WNDPROC
    ''to set the address of the window procedure.
    Call SetWindowLong(gButtonHwnd&, GWL_WNDPROC, GetAddress(AddressOf ButtonWndProc))
    CreateWindows = (gHwnd& <> 0)
End Function
 
Public Function WndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam _
As Long) As Long
    ''This our default window procedure for the window. It will handle all
    ''of our incoming window messages and we will write code based on the
    ''window message what the program should do.
    Dim strTemp As String
    Select Case uMsg&
    Case WM_DESTROY:
        ''Since DefWindowProc doesn't automatically call
        ''PostQuitMessage (WM_QUIT). We need to do it ourselves.
        ''You can use DestroyWindow to get rid of the window manually.
        Call PostQuitMessage(0&)
        Application.Visible = 1 'Восстанавливаем лист
    End Select
    'Пусть windows вызывает оконные процедуры по умолчанию
    WndProc = DefWindowProc(hwnd&, uMsg&, wParam&, lParam&)
End Function
 
Public Function ButtonWndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal _
lParam As Long) As Long
    On Error Resume Next
    Select Case uMsg&
    Case WM_LBUTTONUP:
        ''Left mouse button went up (user clicked the button)
        ''You can use WM_LBUTTONDOWN for the MouseDown event.
        ''We use the MessageBox API call because the built in
        ''function 'MsgBox'stops thread processes, which causes
        ''flickering.
        Call MessageBox(gHwnd&, "Вы нажали на кнопку!", Application.ThisWorkbook.Name, MB_OK Or MB_ICONEXCLAMATION)
    End Select
    ''Since in MyCreateWindow we made the default window proc
    ''this procedure, we have to call the old one using CallWindowProc
    ButtonWndProc = CallWindowProc(gButOldProc&, hwnd&, uMsg&, wParam&, lParam&)
End Function
 
Public Function GetAddress(ByVal lngAddr As Long) As Long
    ''Used with AddressOf to return the address in memory of a procedure.
    GetAddress = lngAddr&
End Function


При запуске листа, сразу-же возникает окно, полностью созданное
с помощью API, с настоящей кнопкой и TextBox-..ом
Картинка:



Скачать лист: API-Форма.xls (47.0 Кб)

Добавлено через 13 минут
Да и вот еще, после закрытия окна, я восстанавливаю лист
строчкой 168: Application.Visible = 1 'Восстанавливаем лист
если этого не сделать, то трудно будет потом внести изменения в лист..
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
05.09.2014, 16:13  [ТС]
...

Добавлено через 13 минут
Если набраться терпения, можно сделать класс
чтото вроде как у VB6, VBControlExtender
в котором будут реализованны стандартные события и свойства..
а далее можно обявлять этот клас и писать в его свойстве например [Кнопка] или [текст]
всё.. можно насоздать множество кнопок, и прочего, прочего, прочего

Добавлено через 1 минуту
А хэндлы хранить в коллекции модуля, ну для мультииспользования..

Добавлено через 1 минуту
Кстати !, есть идея, можно создать UserForm с компонентами..
и перекопировать в виде своих на эту форму, а стартовую форму уничтожить..
тогда получится так, что можно в дизайнере править

Добавлено через 6 минут
Стандартных компонентов не много, так-что сделать можно,
..даже манифест не нужен, (к тому-же, можно воспользоваться эффектами от The Trick !)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.09.2014, 16:13

Как получить handle формы?
Создал форму способом описанным здесь: https://www.cyberforum.ru/blogs/390663/blog2003.html #include &quot;MyForm.h&quot; using...

Как получить handle дочернего элемента если функция вызывается по событию?
Для задания координат подсказки для элементов div на все div с name=&quot;div2&quot; навешивается Listener который вызывает функцию mousemove_xy в...

Как из дочерней формы получить доступ к элементу управления родительской формы
Есть две формы: родительская(Form1) и дочерняя(Form2). В родительской форме(Form1) находятся textBox1 и button1. В дочерней форме...

Получить handle элемента
Доброе время суток я уже всю голову себе сломал как получить handle эмелента на форме есть компонент Chromium ...

Как получить доступ к элементам управления другой формы
как можно получит значение элементов первой формы если в проекте 2 формы Form1 f = new Form1(); f.ShowDialog(); this.textBox1.Text =...


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru