|
Изменение свойств Controls UserForm на экране при перемещении пользователем мыши по экрану
|
|||
---|---|---|---|
#18+
Здравствуйте! Никак не могу найти ошибку в своем коде в силу недостаточности уровня знаний в понимании правил использования обратного вызова с использованием API функций. Начнем по порядку. Итак, есть задача - изменять для визуальной наглядности пользователю состояние свойств объектов (Controls) загруженной и выведенной на экран формы (UserForm) при перемещении пользователем мыши по экрану окна. Возьмем для простоты простейшую форму, содержащую объект Image. Желаемое: Если пользователь навел курсор мыши на форму (курсор мыши внутри координат формы), то фон Image зеленый. Если пользователь перевел курсор мыши за пределы координат формы , то фон Image становится красный. Все это я пытаюсь реализовать в 64-bit операционной системе с установленной версией Office, использующего 64-разрядную версию VBA. Создавая различного рода запросы в поисковике для решения своей задачи я выяснил, что в помощь мне функция API TRACKMOUSEEVENT. И даже нашел практический пример по ссылке: http://rusproject.narod.ru/winapi/t/trackmouseevent.html Изучив его, я понял, что мне его необходимо адаптировать в свою операционную среду. И тут снова мне в помощь пришел найденный справочный материал: https://codekabinett.com/rdumps.php?Lang=2&targetDoc=windows-api-declaration-vba-64-bit Изучив на его основании типы аргументов необходимых мне API функций, я адаптировал их декларацию под версию VBA 64-bit. При проверке компиляции кода в среде VBA.Project все хорошо. Однако результат выполнения кода не дает нужного результата. Более того, при пошаговом выполнении наблюдается серьезный сбой, когда приложение Excel просто перезагружается или даже закрывается. И это происходит именно на этапе обращения к функции обратного вызова. Теперь конкретно о коде. Вот код основного модуля Код: vbnet 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.
В процедуре Hook основного модуля используется параметр дескриптора окна пользовательской формы frmHwnd . Я знаю, что у UserForm и его Controls нет свойства hwnd , поэтому мне опять же в помощь пришел справочный материал: https://colinlegg.wordpress.com/2016/05/06/getting-a-handle-on-userforms-vba/, изучив который я научился считывать дескриптор пользовательской формы. Соответственно, код класса оговоренной для примера формы приобрел следующий вид: Код: vbnet 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.
Однако, не работает( При пошаговом исполнении при обращении к функции WindowProc , я заметил, что параметр uMsg вообще даже близко не сопоставляется с установленной константой WM_MOUSELEAVE . При этом происходит рекурсивное обращение к указанной функции, параметр uMsg меняется каждый раз, а после раза 4-5 рекурсивного вызова, приложение просто перезапускается или выгружается. Уважаемые знатоки темы, подскажите, где у меня ошибка и/или чего мне не хватает (кроме ума и знаний, тут понятно, шутки будут неуместны). ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2021, 01:32 |
|
|
start [/forum/topic.php?fid=60&fpage=2&tid=2154724]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
31ms |
get tp. blocked users: |
2ms |
others: | 275ms |
total: | 383ms |
0 / 0 |