Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
2 / 2 / 0
Регистрация: 13.05.2023
Сообщений: 19

Как отловить изменение "Me.Text" в "VB.NET"

13.05.2023, 12:57. Показов 2842. Ответов 52
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!))

Вопрос такой.
Как отловить событие изменения текста в "Me.Text"?

Меняется этот текст другой программой, так что, нужно не проверить изменился-ли текст, а именно отловить событие!

Зарание спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.05.2023, 12:57
Ответы с готовыми решениями:

Как отловить изменение переменной
В одном проекте несколько форм, одна форма создает пустую переменную а другая форма ее изменяет Так фот как без цикла сравнения можно...

Как отловить изменение в контроле Label
В общем требуется выполнять определенный код при изменении свойства Caption у данного контрола. Знаю в других языках есть событие Change у...

Как отловить изменение размера дива
В общем то сабж, но уточню. На сайте див меняет ширину в из удаления какого либо элемента. Вот сам момент изменения размеров div можно...

52
2 / 2 / 0
Регистрация: 13.05.2023
Сообщений: 19
20.05.2023, 17:10  [ТС]
Студворк — интернет-сервис помощи студентам
Yury Komar, К сожалению как видно на скрине, нет SendMessage без "W", а с ней, моя программа наконец-то начала реагировать на приходящие сообщения, но почемуто нечего не присылает и заголовок становится просто пустым.

m.Msg содержит цыфру 12
WM_SETTEXT содержит цыфру 12
WM_NCUAHDRAWCAPTION содержит цыфру 174

Но не текст сообщения...
Миниатюры
Как отловить изменение "Me.Text" в "VB.NET"  
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4375 / 3445 / 512
Регистрация: 27.01.2014
Сообщений: 6,267
20.05.2023, 18:47
Qutrum, WM_NCUAHDRAWCAPTION не присылает сообщения, она может использоваться как тригер.
а вот Lparam у WM.SETTEXT должен иметь текст сообшения, в примерах выше есть код, вытягивающмй этот текст в String.

Добавлено через 5 минут
Qutrum, а попробуйте в MT добавить LPARAM в коде SendMessageW

C++
1
SendMessageW(h, WM_SETTEXT, 0, (LPARAM)"НовыйЗаголовок");
Добавлено через 4 минуты
и да, если WM_SETTEXT ловится вашей программой, тогда ловить WM_NCUAHDRAWCAPTION уже нет необходимости.
0
2298 / 1614 / 400
Регистрация: 26.06.2017
Сообщений: 4,780
Записей в блоге: 1
21.05.2023, 09:21
По моему товарищи Вы страдаете ерундой!
Есть разделяемая память. В программе отправителе пуляете текст в блок памяти. На принимающей стороне создаёте поток для чтения этой памяти в бесконечном цикле с необходимым интервалом, как только потоком чтения обнаруживается изменение сообщения он создаёт событие, где параметром отдаёт само сообщение. Всё. Как реагировать на событие потока думаю объяснять не надо.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4375 / 3445 / 512
Регистрация: 27.01.2014
Сообщений: 6,267
21.05.2023, 10:43
Uswer, Да тут не факт, что этот MetaTrader4 способен посылать в разделяему память...
Не факт, что ТС с этим разберется.
0
2 / 2 / 0
Регистрация: 13.05.2023
Сообщений: 19
21.05.2023, 17:24  [ТС]
Uswer, Спасибо за вариант, но МТ4Б из-за своего уровня защиты, не разрешает такого делать. А если и делать так, то только через создание своей DLL, в которой и будет вызываться необходимый для этого функционал.
В общем, это точно не проще))

Добавлено через 1 час 43 минуты
Yury Komar, Ура!)) Добился я искомого, что правда, не совсем тем коротким путём, что искал))

Решение:

На стороне MetaTrader4, в советнике пишем следующий код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Импорт библиотек для работы с WinApi в МТ4
#include <WinUser32.mqh> 
#import "kernel32.dll"
#import "user32.dll"
// В функции OnTick(), ну или где кому нужно, пишем следующее
void OnTick() {
   string m_msg = "My prog"; // Создаём переменную, в которой будет храниться имя нужного нам окна другой  
                                      // программы.
   int h=FindWindowW(NULL, m_msg);   // В функции FindWindowW узнаём хэндл нужного нам окна 
   SetWindowTextW(h, "New name");    // Функцией SetWindowTextW, меняем текст заголовка нужного нам окна, тем самым 
                                       // передаём нужные нам данные в наше окно/программу. 
   SendMessageW(h, WM_SETICON, 0, 0); // SendMessageW отправляет нашему окну сообщение в поток, этим 
                                       // сообщением, мы создаём событие в нашей программе. 
                                       // Важно! В параметре "msg", функции SendMessageW, передаём именно  
                                       // WM_SETICON (Меняем размер иконки в заголовке формы).
                                       // Так как WM_SETTEXT, меняет сам заголовок на пустое значение.
                                       // Почему не передаётся текст сообщения, я думаю нужно у разработчиков МТ4
                                       // спрашивать)) 
 
}
Далее, в нашей программе на VB.NET пишем следующее:

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
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
Imports System.Runtime.InteropServices
 
Public Class Form1
    Inherits Form
 
   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      BuildHashtable()
   End Sub
 
    <DllImport("user32.dll", CharSet:=CharSet.Auto)>
    Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As String) As IntPtr
    End Function
 
   ' Ловим событие изминения размеров значка
   Dim htMessages As New Hashtable
   Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Dim s As String
        s = "0x" + String.Format("{0:X4}", m.Msg)
        res_mes(s) ' Вызываем нашу функцию, которая отфильтрует приходящее сообщение из SendMessageW, 
                    ' собственно, в принцепе из очереди сообщений.
                    ' И да!)) На вопрос, "Зачем отсюда вызывать и создавать отдельную функцию?", 
                    ' Скажу одно! Попробуйте по другому и вы поймёте почему нужно именно из функции в функцию 
                    ' передавать!))
        MyBase.WndProc(m)
    End Sub
 
    ' Функция, которая отфильтрует приходящее сообщение и при необходимости, вызовет другую функцию 
    ' для дальнейшей работы с приходящими данными
    Public Sub res_mes(ByVal txt_m As String)
        Try
            If txt_m = "0x0080" Then
                kop_txt()
            End If
        Catch ex As Exception
            MsgBox("ex.Message")
        End Try
    End Sub
  
    ' Следующая функция, нужна для получения данных с заголовка и возврата текста заголовка в исходное состояние
    '  для дальнейшей работы.
    Public Sub kop_txt()
        Dim p_text As String = Me.Text
        TextBox1.Text = p_text + vbCrLf + TextBox1.Text ' Здесь просто для примера я всё приходящее пишу в текстовое поле
        If Me.Text <> "My prog" Then
            Me.Text = "My prog" ' Возвращаем исходный текст заголовка для следующего приёма данных
        End If
    End Sub
 
    ' Эту функцию думаю не нужно объяснять))
    Private Sub BuildHashtable()
        htMessages.Add("0x000C", "WM_SETTEXT")
        htMessages.Add("0x0080", "WM_SETICON")
    End Sub
End Class
Да, понимаю, что интересные костыли наделал)) Но подругому, почему-то не работает!
Код старался комментировать на понятном языке, но если гдето неправильно чтото сказал, поправьте))
1
Модератор
Эксперт .NET
 Аватар для Yury Komar
4375 / 3445 / 512
Регистрация: 27.01.2014
Сообщений: 6,267
21.05.2023, 17:42
Qutrum, Ну я вас поздравляю! Пусть и немного не так, как на самом деле должно быть, ввиду непонятных огранечений самого MT4, но если результата удалось добиться - я за Вас очень рад.

Тоесть, вы посылаете текст заголовку все тем же путем, через SetWindowText, но в качестве тригера дёргаете иконку, чтоб ваше ПО среагировало? А как с задержками, всетаки дополнительные доли секунд могут пройти между установкой заголовка и манипуляциями с иконкой (пусть и впустую)?
1
2 / 2 / 0
Регистрация: 13.05.2023
Сообщений: 19
21.05.2023, 17:45  [ТС]
Yury Komar, Да, вся печаль заключается в ограничениях МТ4... На С++ всё было-бы намного проще))
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4375 / 3445 / 512
Регистрация: 27.01.2014
Сообщений: 6,267
21.05.2023, 17:56
а по поводу возврата заголовка в исходное значение - думаю лишнее и тоже доли секунд займет на выполнение этого кода, а для Вас, я так понял, они важны.
Думаю будет правильней один раз найти хэнд окна по заголовку, его хранить и в него слать, нет необходимости каждый раз его искать перед отправкой текста заголовку.

Добавлено через 5 минут
Qutrum, Кстати, с таким простым функционалом, Вы легко можете создать свью DLL, описал все те же WinAPI, и посылать текст уже по-человечески... Как бы, сейчас решение нашли, на досуге можете заняться этим... Как и писал выше Uswer.
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18409 / 14340 / 5371
Регистрация: 17.03.2014
Сообщений: 29,028
Записей в блоге: 1
21.05.2023, 18:07
Qutrum, раз из MT4 можно вызвать SendMessage, то проще слать свое сообщение с кодом WM_USER+n (n>=0). И обрабатывать его в приложении.

Цитата Сообщение от Qutrum Посмотреть сообщение
s = "0x" + String.Format("{0:X4}", m.Msg)
If txt_m = "0x0080" Then
Это что за жесть? If переменная = &h0080 Then уже отменили? И для улучшения читабельности не помешает ввести константу.
VB.NET
1
2
Const WM_SETICON As Integer = &h0080
If переменная = WM_SETICON Then
Цитата Сообщение от Qutrum Посмотреть сообщение
И да!)) На вопрос, "Зачем отсюда вызывать и создавать отдельную функцию?",
' Скажу одно! Попробуйте по другому и вы поймёте почему нужно именно из функции в функцию
' передавать!))
Да нет, лучше расскажите.
0
2 / 2 / 0
Регистрация: 13.05.2023
Сообщений: 19
21.05.2023, 18:08  [ТС]
Yury Komar, Да, вы правильно говорите, но здесь такой момент, что весь скрипт на стороне МТ4 выполняеься от начала и до конца каждый "ТИК". Следовательно, хранить хэндл нужно либо в файле, либо в буфере обмена (что не реально, так как в любой момент он может изминиться пользователем) и перечитывать снова и снова от-туда... Что по сути, будет дольше чем читать его каждый раз из функции FindWindowW.
А просто в переменной хранить нельзя, так как при каждом тике, будет в любом случае она пересоздаваться и перезаписываться.

Вообще, суть работы скриптов и советников в МТ4 очень похожа на работу РНР. Так как сама МТ4, выступает скорее в роли сервера на котором работают эти самые скрипты и советники...

У скриптов советников, просто за основу взят синтаксис С++, но это не С++)) Это вообще язык MQL4
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4375 / 3445 / 512
Регистрация: 27.01.2014
Сообщений: 6,267
21.05.2023, 18:28
Qutrum, тоесть "снаружи" функции OnTick() совсем нельзя создать переменную? Да, и правда жесткие ограничения.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18409 / 14340 / 5371
Регистрация: 17.03.2014
Сообщений: 29,028
Записей в блоге: 1
21.05.2023, 18:41
Цитата Сообщение от Yury Komar Посмотреть сообщение
тоесть "снаружи" функции OnTick() совсем нельзя создать переменную?
Судя по документации можно. Цитата:
Header

The header usually provides basic information about the program first, such as the version, authorship, description, etc.

...

Furthermore, we define the global variables in the header.
Кроме того в наличии функция OnInit которую. как раз можно использовать для инициализации. Вопрос только нужно ли. С одной стороны если закэшировать дескриптор окна, то мы экономим время. С другой стороны, если приложение-получатель перезапустят, то дескриптор окна изменится и сообщения будут уходить в пустоту. Скорее всего надежнее использовать связку FindWindow/SendMessage.
1
2 / 2 / 0
Регистрация: 13.05.2023
Сообщений: 19
21.05.2023, 18:47  [ТС]
OwenGlendower, Не SendMessage, а SendMessageW... А они немного отличаются))

If txt_m = "0x0080" Then - Это не жесть)) Это сравнение с приходящим текстом)) А так нужно, потому, что вот что может в моей программе вообще приходить:

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
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
Private Sub BuildHashtable()
        htMessages.Add("0x0000", "WM_NULL")
        htMessages.Add("0x0001", "WM_CREATE")
        htMessages.Add("0x0002", "WM_DESTROY")
        htMessages.Add("0x0003", "WM_MOVE")
        htMessages.Add("0x0005", "WM_SIZE")
        htMessages.Add("0x0006", "WM_ACTIVATE")
        htMessages.Add("0x0007", "WM_SETFOCUS")
        htMessages.Add("0x0008", "WM_KILLFOCUS")
        htMessages.Add("0x000A", "WM_ENABLE")
        htMessages.Add("0x000B", "WM_SETREDRAW")
        htMessages.Add("0x000C", "WM_SETTEXT")
        htMessages.Add("0x000D", "WM_GETTEXT")
        htMessages.Add("0x000E", "WM_GETTEXTLENGTH")
        htMessages.Add("0x000F", "WM_PAINT")
        htMessages.Add("0x0010", "WM_CLOSE")
        htMessages.Add("0x0011", "WM_QUERYENDSESSION")
        htMessages.Add("0x0013", "WM_QUERYOPEN")
        htMessages.Add("0x0016", "WM_ENDSESSION")
        htMessages.Add("0x0012", "WM_QUIT")
        htMessages.Add("0x0014", "WM_ERASEBKGND")
        htMessages.Add("0x0015", "WM_SYSCOLORCHANGE")
        htMessages.Add("0x0018", "WM_SHOWWINDOW")
        htMessages.Add("0x001A", "WM_WININICHANGE")
        htMessages.Add("0x001B", "WM_DEVMODECHANGE")
        htMessages.Add("0x001C", "WM_ACTIVATEAPP")
        htMessages.Add("0x001D", "WM_FONTCHANGE")
        htMessages.Add("0x001E", "WM_TIMECHANGE")
        htMessages.Add("0x001F", "WM_CANCELMODE")
        htMessages.Add("0x0020", "WM_SETCURSOR")
        htMessages.Add("0x0021", "WM_MOUSEACTIVATE")
        htMessages.Add("0x0022", "WM_CHILDACTIVATE")
        htMessages.Add("0x0023", "WM_QUEUESYNC")
        htMessages.Add("0x0024", "WM_GETMINMAXINFO")
        htMessages.Add("0x0026", "WM_PAINTICON")
        htMessages.Add("0x0027", "WM_ICONERASEBKGND")
        htMessages.Add("0x0028", "WM_NEXTDLGCTL")
        htMessages.Add("0x002A", "WM_SPOOLERSTATUS")
        htMessages.Add("0x002B", "WM_DRAWITEM")
        htMessages.Add("0x002C", "WM_MEASUREITEM")
        htMessages.Add("0x002D", "WM_DELETEITEM")
        htMessages.Add("0x002E", "WM_VKEYTOITEM")
        htMessages.Add("0x002F", "WM_CHARTOITEM")
        htMessages.Add("0x0030", "WM_SETFONT")
        htMessages.Add("0x0031", "WM_GETFONT")
        htMessages.Add("0x0032", "WM_SETHOTKEY")
        htMessages.Add("0x0033", "WM_GETHOTKEY")
        htMessages.Add("0x0037", "WM_QUERYDRAGICON")
        htMessages.Add("0x0039", "WM_COMPAREITEM")
        htMessages.Add("0x003D", "WM_GETOBJECT")
        htMessages.Add("0x0041", "WM_COMPACTING")
        htMessages.Add("0x0044", "WM_COMMNOTIFY")
        htMessages.Add("0x0046", "WM_WINDOWPOSCHANGING")
        htMessages.Add("0x0047", "WM_WINDOWPOSCHANGED")
        htMessages.Add("0x0048", "WM_POWER")
        htMessages.Add("0x004A", "WM_COPYDATA")
        htMessages.Add("0x004B", "WM_CANCELJOURNAL")
        htMessages.Add("0x004E", "WM_NOTIFY")
        htMessages.Add("0x0050", "WM_INPUTLANGCHANGEREQUEST")
        htMessages.Add("0x0051", "WM_INPUTLANGCHANGE")
        htMessages.Add("0x0052", "WM_TCARD")
        htMessages.Add("0x0053", "WM_HELP")
        htMessages.Add("0x0054", "WM_USERCHANGED")
        htMessages.Add("0x0055", "WM_NOTIFYFORMAT")
        htMessages.Add("0x007B", "WM_CONTEXTMENU")
        htMessages.Add("0x007C", "WM_STYLECHANGING")
        htMessages.Add("0x007D", "WM_STYLECHANGED")
        htMessages.Add("0x007E", "WM_DISPLAYCHANGE")
        htMessages.Add("0x007F", "WM_GETICON")
        htMessages.Add("0x0080", "WM_SETICON")
        htMessages.Add("0x0081", "WM_NCCREATE")
        htMessages.Add("0x0082", "WM_NCDESTROY")
        htMessages.Add("0x0083", "WM_NCCALCSIZE")
        htMessages.Add("0x0084", "WM_NCHITTEST")
        htMessages.Add("0x0085", "WM_NCPAINT")
        htMessages.Add("0x0086", "WM_NCACTIVATE")
        htMessages.Add("0x0087", "WM_GETDLGCODE")
        htMessages.Add("0x0088", "WM_SYNCPAINT")
        htMessages.Add("0x00A0", "WM_NCMOUSEMOVE")
        htMessages.Add("0x00A1", "WM_NCLBUTTONDOWN")
        htMessages.Add("0x00A2", "WM_NCLBUTTONUP")
        htMessages.Add("0x00A3", "WM_NCLBUTTONDBLCLK")
        htMessages.Add("0x00A4", "WM_NCRBUTTONDOWN")
        htMessages.Add("0x00A5", "WM_NCRBUTTONUP")
        htMessages.Add("0x00A6", "WM_NCRBUTTONDBLCLK")
        htMessages.Add("0x00A7", "WM_NCMBUTTONDOWN")
        htMessages.Add("0x00A8", "WM_NCMBUTTONUP")
        htMessages.Add("0x00A9", "WM_NCMBUTTONDBLCLK")
        htMessages.Add("0x00AB", "WM_NCXBUTTONDOWN")
        htMessages.Add("0x00AC", "WM_NCXBUTTONUP")
        htMessages.Add("0x00AD", "WM_NCXBUTTONDBLCLK")
        htMessages.Add("0x00FF", "WM_INPUT")
        htMessages.Add("0x0100", "WM_KEYDOWN")
        htMessages.Add("0x0101", "WM_KEYUP")
        htMessages.Add("0x0102", "WM_CHAR")
        htMessages.Add("0x0103", "WM_DEADCHAR")
        htMessages.Add("0x0104", "WM_SYSKEYDOWN")
        htMessages.Add("0x0105", "WM_SYSKEYUP")
        htMessages.Add("0x0106", "WM_SYSCHAR")
        htMessages.Add("0x0107", "WM_SYSDEADCHAR")
        htMessages.Add("0x0109", "WM_KEYLAST")
        htMessages.Add("0x0108", "WM_KEYLAST")
        htMessages.Add("0x0110", "WM_INITDIALOG")
        htMessages.Add("0x0111", "WM_COMMAND")
        htMessages.Add("0x0112", "WM_SYSCOMMAND")
        htMessages.Add("0x0113", "WM_TIMER")
        htMessages.Add("0x0114", "WM_HSCROLL")
        htMessages.Add("0x0115", "WM_VSCROLL")
        htMessages.Add("0x0116", "WM_INITMENU")
        htMessages.Add("0x0117", "WM_INITMENUPOPUP")
        htMessages.Add("0x011F", "WM_MENUSELECT")
        htMessages.Add("0x0120", "WM_MENUCHAR")
        htMessages.Add("0x0121", "WM_ENTERIDLE")
        htMessages.Add("0x0122", "WM_MENURBUTTONUP")
        htMessages.Add("0x0123", "WM_MENUDRAG")
        htMessages.Add("0x0124", "WM_MENUGETOBJECT")
        htMessages.Add("0x0125", "WM_UNINITMENUPOPUP")
        htMessages.Add("0x0126", "WM_MENUCOMMAND")
        htMessages.Add("0x0127", "WM_CHANGEUISTATE")
        htMessages.Add("0x0128", "WM_UPDATEUISTATE")
        htMessages.Add("0x0129", "WM_QUERYUISTATE")
        htMessages.Add("0x0132", "WM_CTLCOLORMSGBOX")
        htMessages.Add("0x0133", "WM_CTLCOLOREDIT")
        htMessages.Add("0x0134", "WM_CTLCOLORLISTBOX")
        htMessages.Add("0x0135", "WM_CTLCOLORBTN")
        htMessages.Add("0x0136", "WM_CTLCOLORDLG")
        htMessages.Add("0x0137", "WM_CTLCOLORSCROLLBAR")
        htMessages.Add("0x0138", "WM_CTLCOLORSTATIC")
        htMessages.Add("0x0200", "WM_MOUSEMOVE")
        htMessages.Add("0x0201", "WM_LBUTTONDOWN")
        htMessages.Add("0x0202", "WM_LBUTTONUP")
        htMessages.Add("0x0203", "WM_LBUTTONDBLCLK")
        htMessages.Add("0x0204", "WM_RBUTTONDOWN")
        htMessages.Add("0x0205", "WM_RBUTTONUP")
        htMessages.Add("0x0206", "WM_RBUTTONDBLCLK")
        htMessages.Add("0x0207", "WM_MBUTTONDOWN")
        htMessages.Add("0x0208", "WM_MBUTTONUP")
        htMessages.Add("0x0209", "WM_MBUTTONDBLCLK")
        htMessages.Add("0x020A", "WM_MOUSEWHEEL")
        htMessages.Add("0x020D", "WM_MOUSELAST")
        htMessages.Add("0x0210", "WM_PARENTNOTIFY")
        htMessages.Add("0x0211", "WM_ENTERMENULOOP")
        htMessages.Add("0x0212", "WM_EXITMENULOOP")
        htMessages.Add("0x0213", "WM_NEXTMENU")
        htMessages.Add("0x0214", "WM_SIZING")
        htMessages.Add("0x0215", "WM_CAPTURECHANGED")
        htMessages.Add("0x0216", "WM_MOVING")
        htMessages.Add("0x0218", "WM_POWERBROADCAST")
        htMessages.Add("0x0219", "WM_DEVICECHANGE")
        htMessages.Add("0x0220", "WM_MDICREATE")
        htMessages.Add("0x0221", "WM_MDIDESTROY")
        htMessages.Add("0x0222", "WM_MDIACTIVATE")
        htMessages.Add("0x0223", "WM_MDIRESTORE")
        htMessages.Add("0x0224", "WM_MDINEXT")
        htMessages.Add("0x0225", "WM_MDIMAXIMIZE")
        htMessages.Add("0x0226", "WM_MDITILE")
        htMessages.Add("0x0227", "WM_MDICASCADE")
        htMessages.Add("0x0228", "WM_MDIICONARRANGE")
        htMessages.Add("0x0229", "WM_MDIGETACTIVE")
        htMessages.Add("0x0230", "WM_MDISETMENU")
        htMessages.Add("0x0231", "WM_ENTERSIZEMOVE")
        htMessages.Add("0x0232", "WM_EXITSIZEMOVE")
        htMessages.Add("0x0233", "WM_DROPFILES")
        htMessages.Add("0x0234", "WM_MDIREFRESHMENU")
        htMessages.Add("0x0281", "WM_IME_SETCONTEXT")
        htMessages.Add("0x0282", "WM_IME_NOTIFY")
        htMessages.Add("0x0283", "WM_IME_CONTROL")
        htMessages.Add("0x0284", "WM_IME_COMPOSITIONFULL")
        htMessages.Add("0x0285", "WM_IME_SELECT")
        htMessages.Add("0x0286", "WM_IME_CHAR")
        htMessages.Add("0x0288", "WM_IME_REQUEST")
        htMessages.Add("0x0290", "WM_IME_KEYDOWN")
        htMessages.Add("0x0291", "WM_IME_KEYUP")
        htMessages.Add("0x02A1", "WM_MOUSEHOVER")
        htMessages.Add("0x02A3", "WM_MOUSELEAVE")
        htMessages.Add("0x02A0", "WM_NCMOUSEHOVER")
        htMessages.Add("0x02A2", "WM_NCMOUSELEAVE")
        htMessages.Add("0x02B1", "WM_WTSSESSION_CHANGE")
        htMessages.Add("0x02C0", "WM_TABLET_FIRST")
        htMessages.Add("0x02DF", "WM_TABLET_LAST")
        htMessages.Add("0x0300", "WM_CUT")
        htMessages.Add("0x0301", "WM_COPY")
        htMessages.Add("0x0302", "WM_PASTE")
        htMessages.Add("0x0303", "WM_CLEAR")
        htMessages.Add("0x0304", "WM_UNDO")
        htMessages.Add("0x0305", "WM_RENDERFORMAT")
        htMessages.Add("0x0306", "WM_RENDERALLFORMATS")
        htMessages.Add("0x0307", "WM_DESTROYCLIPBOARD")
        htMessages.Add("0x0308", "WM_DRAWCLIPBOARD")
        htMessages.Add("0x0309", "WM_PAINTCLIPBOARD")
        htMessages.Add("0x030A", "WM_VSCROLLCLIPBOARD")
        htMessages.Add("0x030B", "WM_SIZECLIPBOARD")
        htMessages.Add("0x030C", "WM_ASKCBFORMATNAME")
        htMessages.Add("0x030D", "WM_CHANGECBCHAIN")
        htMessages.Add("0x030E", "WM_HSCROLLCLIPBOARD")
        htMessages.Add("0x030F", "WM_QUERYNEWPALETTE")
        htMessages.Add("0x0310", "WM_PALETTEISCHANGING")
        htMessages.Add("0x0311", "WM_PALETTECHANGED")
        htMessages.Add("0x0312", "WM_HOTKEY")
        htMessages.Add("0x0317", "WM_PRINT")
        htMessages.Add("0x0318", "WM_PRINTCLIENT")
        htMessages.Add("0x0319", "WM_APPCOMMAND")
        htMessages.Add("0x031A", "WM_THEMECHANGED")
        htMessages.Add("0x0358", "WM_HANDHELDFIRST")
        htMessages.Add("0x035F", "WM_HANDHELDLAST")
        htMessages.Add("0x0360", "WM_AFXFIRST")
        htMessages.Add("0x037F", "WM_AFXLAST")
        htMessages.Add("0x0380", "WM_PENWINFIRST")
        htMessages.Add("0x038F", "WM_PENWINLAST")
        htMessages.Add("0x8000", "WM_APP")
        htMessages.Add("0x0400", "WM_USER")
    End Sub
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Да нет, лучше расскажите.
При попытке обработки в функции
VB.NET
1
2
3
4
5
6
7
8
9
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Dim s As String
        s = "0x" + String.Format("{0:X4}", m.Msg)
        If Me.Text <> "My prog" Then
            Me.Text = "My prog"
        End If
        res_mes(s)
        MyBase.WndProc(m)
    End Sub
происходит перегрузка и соответственно "Необработанное исключение типа "System.StackOverflowException" в mscorlib.dll"

Добавлено через 3 минуты
Цитата Сообщение от Yury Komar Посмотреть сообщение
тоесть "снаружи" функции OnTick() совсем нельзя создать переменную?
Создать можно, но она умрёт при следующем тике (приходящих в МТ4 данных и изменении графика).
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18409 / 14340 / 5371
Регистрация: 17.03.2014
Сообщений: 29,028
Записей в блоге: 1
21.05.2023, 19:16
Цитата Сообщение от Qutrum Посмотреть сообщение
Не SendMessage, а SendMessageW... А они немного отличаются))
В рамках данной дискуссии эти различия не принципиальны. К тому же если вы хотите придираться, то функции SendMessage вообще нет. Это макрос который раскрывается в SendMessageA или SendMessageW.

Цитата Сообщение от Qutrum Посмотреть сообщение
Это не жесть)) Это сравнение с приходящим текстом)) А так нужно, потому, что вот что может в моей программе вообще приходить:
VB.NET
1
2
3
4
5
Dim htMessages As New Hashtable
Private Sub BuildHashtable()
        htMessages.Add("0x0000", "WM_NULL")
        htMessages.Add("0x0001", "WM_CREATE")
...
Во-первых, про Hashtable давно пора забыть и использовать Dictionary(Of TKey, TValue) из пространства имен System.Collections.Generic. Во-вторых, а зачем вам словарь сообщений, да и в принципе зачем столько сообщений? Они за разные данные от MT4 отвечают?

Цитата Сообщение от Qutrum Посмотреть сообщение
При попытке обработки в функции ... происходит перегрузка и соответственно "Необработанное исключение типа "System.StackOverflowException" в mscorlib.dll"
Так примеры отличаются - в одном случае вы проверяете Msg в другом нет. Думаю что проблема в том что вы используете системные сообщения там где лучше было использовать пользовательские (WM_USER+n).

Цитата Сообщение от Qutrum Посмотреть сообщение
Создать можно, но она умрёт при следующем тике (приходящих в МТ4 данных и изменении графика).
У меня нет MT4 чтобы проверить, но судя по документации что-то такое должно работать без ошибок.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <WinUser32.mqh> 
#import "kernel32.dll"
#import "user32.dll"
 
int MY_HWND;
 
void OnInit()
{
    string m_msg = "My prog";
    MY_HWND = FindWindowW(NULL, m_msg);
}
 
void OnTick()
{
   SetWindowTextW(MY_HWND, "New name");
}
1
84 / 80 / 6
Регистрация: 11.04.2021
Сообщений: 318
Записей в блоге: 7
21.05.2023, 20:09
А так ни проще? У окна есть два Event (a) Один MyBase.TextChanged и второй это Me.Shown
Кликните здесь для просмотра всего текста

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
Public Class Form1
    Private isLoadet As Boolean = False
 
 
    Private Sub TitleCanged(sender As Object, e As EventArgs) Handles MyBase.TextChanged
        If isLoadet Then MsgBox("Is Changed")
    End Sub
 
 
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Me.Text = "hallo"
    End Sub
 
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Me.Text = "hello"
    End Sub
 
 
 
    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        isLoadet = True
    End Sub
End Class




можно тоже самое и через AddHandler ковырнуть
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18409 / 14340 / 5371
Регистрация: 17.03.2014
Сообщений: 29,028
Записей в блоге: 1
21.05.2023, 20:23
edmonsur, ТС пробовал нечто подобное, насколько я понимаю. Не сработало.
0
84 / 80 / 6
Регистрация: 11.04.2021
Сообщений: 318
Записей в блоге: 7
21.05.2023, 20:32
OwenGlendower у меня работает
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18409 / 14340 / 5371
Регистрация: 17.03.2014
Сообщений: 29,028
Записей в блоге: 1
21.05.2023, 20:33
edmonsur, окей.
1
84 / 80 / 6
Регистрация: 11.04.2021
Сообщений: 318
Записей в блоге: 7
21.05.2023, 21:05
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
    Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As IntPtr, ByVal lpString As System.Text.StringBuilder, ByVal cch As Integer) As Integer
 
 
 
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
 
        Dim Title As New System.Text.StringBuilder(256)
        GetWindowText(Me.Handle, Title, Title.Capacity)
        MsgBox(Title.ToString)
 
    End Sub
End Class
0
2 / 2 / 0
Регистрация: 13.05.2023
Сообщений: 19
21.05.2023, 21:10  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
В рамках данной дискуссии эти различия не принципиальны
Они принципиальны, так как из С++ вызвать SendMessage можно с параметрами WPARAM и LPARAM, а из MQL4, что не пихай, а будет только "передёргивание" программы и то такой функции нет, есть токо SendMessageW и SendMessageА. А вот из С++ вызывается как SendMessage...
MSDN help:
Отправляет указанное сообщение в окно или окна. Функция SendMessage вызывает оконную процедуру для указанного окна и не возвращает значение до тех пор, пока оконная процедура не обработает сообщение.

Цитата Сообщение от OwenGlendower Посмотреть сообщение
Во-первых, про Hashtable давно пора забыть и использовать Dictionary(Of TKey, TValue) из пространства имен System.Collections.Generic. Во-вторых, а зачем вам словарь сообщений, да и в принципе зачем столько сообщений? Они за разные данные от MT4 отвечают?
Hashtable - работает, зачем о нём забывать? Тем-более в моём случае...
Словарь сообщений мне нужен не для того, чтобы их обрабатывать, а для того, чтобы на них реагировать как на события.
Если посмотреть на моё решение выше, то думаю становится понятно, что я эти вызовы использую не по назначению)) Да и потом, на данный момент идёт проектирование и создаётся каркас программы. В последствии, всё ненужное удалится))

Цитата Сообщение от OwenGlendower Посмотреть сообщение
Так примеры отличаются - в одном случае вы проверяете Msg в другом нет. Думаю что проблема в том что вы используете системные сообщения там где лучше было использовать пользовательские (WM_USER+n).
Всё правильно! В том случае где я выложил решение, всё используется в рабочем режиме! А второй пример с описанием проблемы, это ответ на ваш вопрос.

Цитата Сообщение от OwenGlendower Посмотреть сообщение
У меня нет MT4 чтобы проверить, но судя по документации что-то такое должно работать без ошибок.
А что по сути изменилось?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.05.2023, 21:10

QTableView. Как отловить изменение данных
Здравствуйте. Вопрос: как отловить изменение данных в ячейке? Вот такой коннект получился, но это немного не то: ...

как отловить изменение масштаба страницы
пользователь может увеличить (или уменьшить) масштаб страницы либо через меню &quot;правка&quot;, либо нажатием соответствующей комбинации...

Как отловить изменение ячейки JTable
Есть таблица jTable1. Если изменяется значение ячейки, то должно меняться значение JTextField. Как это реализовать?

Как отловить событие изменение вида курсора?
Здравствуйте друзья! Я новичок в VB.net. Подскажите, пожалуйста, как узнать изменился ли курсор мыши со стрелки на руку с...

Как отловить изменение состояния CheckBox в DatagridView
Не могу понять почему не чекает чекбокс... Сделал dataGridView checkbox Cell, но при нажатие на чекбокс, не чего не происходит. Как...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение 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 и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru