Как работает WindowProc? Как он вообще вызывается?
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
По дефолту он создаётся для класса. Но можно его переопределить для каждого окна. Вызывается он вот как раз то ли в GetMessage то ли в TranslateMessage, непомню точно.
Они каждый раз разные и их позиция тоже, а имя класса у них у всех одинаковое.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Если использую SetWindowLongPtr(hButton,GWLP_WNDPROC, (LONG_PTR)ButtonProc); то кнопка пропадает, но зато вызывается обработчик ButtonProc когда я навожу на него мышь. ЧЯДНТ?
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
XaeroX писал: Может, тебе надо сначала получить старый обработчик, и потом вызывать его в твоём вместо DefWindowProc?
Что подразумевается под старым обработчиком?
Если я правильно понял то это:
lpfnOldWndProc = (WNDPROC)GetWindowLongPtr(hWnd, GWLP_WNDPROC);
и в обработчике вызывать это:
CallWindowProc(lpfnOldWndProc, hwnd, msg, wParam, lParam);
ну ничего не произошло интересного, lpfnOldWndProc получает нули, как от родителя, так и от дочерних, ButtonProc при этом начинает вызываться бесконечно.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Кнопка вроде как начала рисоваться и получает адрес отличный от нуля, в остальном поведение схожее с DefWindowProc, т.е. при наведении вызывается ButtonProc, но при клике на кнопку ничего не происходит.
UPD: Вроде как отлавливает нажатия, при жмакании левой кнопкой мыши на мою кнопку значения внутри ButtonProc выдаёт такие: msg: 243 wParam: 1 lParam: 0
чтобы это не значило (хотя иногда wParam бывает равен и 0), пока не знаю как правильно в винапи их отследить, очередные магические числа. Надеюсь они не меняются от запуска к запуску.
Вот небольшой лог:
C++ Source Code:
1
MSG: 126 wParam: 32 lParam: 70780800
2
MSG: 26 wParam: 42 lParam: 612296422360
3
MSG: 26 wParam: 46 lParam: 612296422360
4
MSG: 15 wParam: 0 lParam: 0
5
MSG: 133 wParam: 1 lParam: 0
6
MSG: 20 wParam: 18446744073155981989 lParam: 0
7
MSG: 15 wParam: 0 lParam: 0
8
MSG: 133 wParam: 1 lParam: 0
9
MSG: 20 wParam: 18446744073155981989 lParam: 0
10
MSG: 15 wParam: 0 lParam: 0
11
MSG: 133 wParam: 1 lParam: 0
12
MSG: 20 wParam: 18446744072266791344 lParam: 0
13
MSG: 15 wParam: 0 lParam: 0
14
MSG: 133 wParam: 1 lParam: 0
15
MSG: 20 wParam: 18446744072266791344 lParam: 0
16
MSG: 15 wParam: 0 lParam: 0
17
MSG: 133 wParam: 1 lParam: 0
18
MSG: 20 wParam: 18446744072266791344 lParam: 0
19
MSG: 15 wParam: 0 lParam: 0
20
MSG: 133 wParam: 1 lParam: 0
21
MSG: 20 wParam: 18446744071847359961 lParam: 0
22
MSG: 132 wParam: 0 lParam: 66846847
23
MSG: 32 wParam: 1118670 lParam: 33554433
24
MSG: 512 wParam: 0 lParam: 1376375
25
MSG: 132 wParam: 0 lParam: 66650236
26
MSG: 32 wParam: 1118670 lParam: 33554433
27
MSG: 512 wParam: 0 lParam: 1179764
28
MSG: 132 wParam: 0 lParam: 66584696
29
MSG: 32 wParam: 1118670 lParam: 33554433
30
MSG: 512 wParam: 0 lParam: 1114224
31
MSG: 15 wParam: 0 lParam: 0
32
MSG: 133 wParam: 1 lParam: 0
33
MSG: 20 wParam: 18446744072266791344 lParam: 0
34
MSG: 132 wParam: 0 lParam: 66388085
35
MSG: 32 wParam: 1118670 lParam: 33554433
36
MSG: 512 wParam: 0 lParam: 917613
37
MSG: 132 wParam: 0 lParam: 66257009
38
MSG: 32 wParam: 1118670 lParam: 33554433
39
MSG: 512 wParam: 0 lParam: 786537
40
MSG: 132 wParam: 0 lParam: 66257006
41
MSG: 32 wParam: 1118670 lParam: 33554433
42
MSG: 512 wParam: 0 lParam: 786534
43
MSG: 132 wParam: 0 lParam: 66191468
44
MSG: 32 wParam: 1118670 lParam: 33554433
45
MSG: 512 wParam: 0 lParam: 720996
46
MSG: 132 wParam: 0 lParam: 66191467
47
MSG: 32 wParam: 1118670 lParam: 33554433
48
MSG: 512 wParam: 0 lParam: 720995
49
MSG: 132 wParam: 0 lParam: 66125930
50
MSG: 32 wParam: 1118670 lParam: 33554433
51
MSG: 512 wParam: 0 lParam: 655458
52
MSG: 132 wParam: 0 lParam: 66125929
53
MSG: 32 wParam: 1118670 lParam: 33554433
54
MSG: 512 wParam: 0 lParam: 655457
55
MSG: 132 wParam: 0 lParam: 66125928
56
MSG: 32 wParam: 1118670 lParam: 33554433
57
MSG: 512 wParam: 0 lParam: 655456
58
MSG: 132 wParam: 0 lParam: 66125928
59
MSG: 33 wParam: 2364392 lParam: 33619969
60
MSG: 32 wParam: 1118670 lParam: 33619969
61
MSG: 513 wParam: 1 lParam: 655456
62
MSG: 7 wParam: 2364392 lParam: 0
63
MSG: 243 wParam: 1 lParam: 0
64
MSG: 514 wParam: 0 lParam: 655456
65
MSG: 243 wParam: 0 lParam: 0
66
MSG: 132 wParam: 0 lParam: 66125928
67
MSG: 32 wParam: 1118670 lParam: 33554433
68
MSG: 512 wParam: 0 lParam: 655456
69
MSG: 132 wParam: 0 lParam: 66125928
70
MSG: 32 wParam: 1118670 lParam: 33554433
71
MSG: 512 wParam: 0 lParam: 655456
72
MSG: 132 wParam: 0 lParam: 66125928
73
MSG: 33 wParam: 2364392 lParam: 33619969
74
MSG: 32 wParam: 1118670 lParam: 33619969
75
MSG: 515 wParam: 1 lParam: 655456
76
MSG: 243 wParam: 1 lParam: 0
77
MSG: 512 wParam: 1 lParam: 655456
78
MSG: 243 wParam: 1 lParam: 0
79
MSG: 514 wParam: 0 lParam: 655456
80
MSG: 243 wParam: 0 lParam: 0
81
MSG: 132 wParam: 0 lParam: 66125928
82
MSG: 32 wParam: 1118670 lParam: 33554433
83
MSG: 512 wParam: 0 lParam: 655456
84
MSG: 132 wParam: 0 lParam: 66125928
85
MSG: 33 wParam: 2364392 lParam: 33619969
86
MSG: 32 wParam: 1118670 lParam: 33619969
87
MSG: 513 wParam: 1 lParam: 655456
88
MSG: 243 wParam: 1 lParam: 0
89
MSG: 514 wParam: 0 lParam: 655456
90
MSG: 243 wParam: 0 lParam: 0
91
MSG: 132 wParam: 0 lParam: 66125928
92
MSG: 32 wParam: 1118670 lParam: 33554433
93
MSG: 512 wParam: 0 lParam: 655456
94
MSG: 132 wParam: 0 lParam: 66125928
95
MSG: 33 wParam: 2364392 lParam: 33619969
96
MSG: 32 wParam: 1118670 lParam: 33619969
97
MSG: 515 wParam: 1 lParam: 655456
98
MSG: 243 wParam: 1 lParam: 0
99
MSG: 514 wParam: 0 lParam: 655456
100
MSG: 243 wParam: 0 lParam: 0
101
MSG: 132 wParam: 0 lParam: 66125928
102
MSG: 32 wParam: 1118670 lParam: 33554433
103
MSG: 512 wParam: 0 lParam: 655456
104
MSG: 132 wParam: 0 lParam: 66125927
105
MSG: 32 wParam: 1118670 lParam: 33554433
106
MSG: 512 wParam: 0 lParam: 655455
107
MSG: 132 wParam: 0 lParam: 66125930
108
MSG: 32 wParam: 1118670 lParam: 33554433
109
MSG: 512 wParam: 0 lParam: 655458
110
MSG: 132 wParam: 0 lParam: 66125938
111
MSG: 32 wParam: 1118670 lParam: 33554433
112
MSG: 512 wParam: 0 lParam: 655466
113
MSG: 132 wParam: 0 lParam: 66257023
114
MSG: 32 wParam: 1118670 lParam: 33554433
115
MSG: 512 wParam: 0 lParam: 786551
116
MSG: 15 wParam: 0 lParam: 0
117
MSG: 133 wParam: 1 lParam: 0
118
MSG: 20 wParam: 151075455 lParam: 0
119
MSG: 15 wParam: 0 lParam: 0
120
MSG: 133 wParam: 1 lParam: 0
121
MSG: 20 wParam: 151075455 lParam: 0
122
MSG: 8 wParam: 0 lParam: 0
123
MSG: 15 wParam: 0 lParam: 0
UPD: В общем какая то жуть. В инете и справке всё неправильно. Пересоздаю кнопку в case WM_ERASEBKGND: и только тогда она начинает обрабатывать события, и более менее не затирается другими элементами. Но иногда мерзко мерцает.
А вот WM_PAINT рисуется вообще только когда мышка наведена на дочернее окно , в остальных случаях он кнопку вообще не рисует.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Справка не предполагает ситуации, что ты подмешиваешь свои кнопки в чужое приложение
Добавлено 30-04-2023 в 08:48:
Но вообще - судя по тому, чем ты занимаешься, я был прав, когда запланировал архитектуру редактора со сменным пользовательским интерфейсом на скриптовом языке. Пользователь обязательно захочет добавить в любимое приложение полезных кнопок, менюшек или комманд.
Главное чтобы сам редактор позволял ему это сделать.
В написал целом более менее стабильный код, наверное не очень правильный, но в моём случае сойдёт, рисует кнопки, не тормозит, не мерацает, не затирается элементами, не зависает и отправляет события.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Дядя Миша писал: А как ты собрался отправлять команды стороннему приложению-то?
У него есть какое-то публичное API?
Есть такая программа CheatEngine она делает дамп памяти любого твоего приложения (ну то есть вообще любого), и позволяет сканировать эту самую память на изменение переменных в реальном времени. Собственно зная изначальное значение ты можешь найти нужный адрес в памяти и приплюсовать его к модулю этого же приложения, тогда ты всегда надёжно сможешь к нему обращаться через ReadProcessMemory, и изменять его значение через WriteProcessMemory.
Естественно память может выделяться и во время выполнения, это более сложно. Я пока работаю с чисто уже выделенными при старте адресами.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!