Здравствуйте, такой непростой (для меня, как оказалось) вопрос. Есть большой (10к+ строк) интерактивный макрос (игра), использующий функции операционной системы для перехвата событий клавиатуры, мышки и проигрывания звуков (пищалкой и системной программой воспроизведения мультимедиа). Вот такой заголовок у моего макроса:
Код |
---|
#if VBA7 then
Declare PtrSafe Function getTickCount Lib "kernel32" Alias "GetTickCount" () As Long
Declare PtrSafe Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Declare PtrSafe Function beep Lib "kernel32" Alias "Beep" (ByVal dwFreq As LongPtr, ByVal dwDuration As LongPtr) As LongPtr
Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Integer, ByVal y As Integer) As Long
Private Declare PtrSafe Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As Any, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
#Else
Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Declare Function getTickCount Lib "kernel32.dll" Alias "GetTickCount" () As Long
Declare Function beep Lib "kernel32" Alias "Beep" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Declare Function SetCursorPos Lib "user32" (ByVal x As Integer, ByVal y As Integer) As Long
Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
#End If
|
Проблема заключается в том, что файл очень по-разному ведет себя на разных компах:
Win XP 32 и Excel 2003 (2 разных компа) - работает без проблем
Win XP 32 и Excel 2007 - работает практически без проблем
Win 7 32 и Excel 2007 - периодически зависает с надписью "программа не отвечает", но потом спустя какое-то время продолжает работать
Win 10 64 и Excel 2007 - периодически зависает с надписью "программа не отвечает"(предполагаю, что в ответ на использование клавиатуры, левая кнопка мыши и перемещение мышиного курсора иногда решают эту проблему, а иногда нет, и тогда Ctrl-Break уже не работает, хотя в коде я его не отключал).
Win 8.1 64 и Excel 2016 - виснет практически сразу (музыку играть начинает, но пишет "программа не отвечает" еще до нажатий на какие-либо клавиши и использование мыши. Что завешивает программу, мне непонятно), Ctrl-Break не работает
Поскольку программа отлично (соответственно скорости компьютера) чувствует себя на старых версиях Windows и Excel, и при этом подвисает или виснет на более мощных и современных машинах, для себя я сделал вывод, что проблема в неправильном объявлении внешних по отношению к коду функций (Уточню: в самом коде у меня новые 64-битные типы данных не используются, но, если я не ошибаюсь, это и не обязательно). Приведенный выше заголовок пытается решить эту проблему, но очевидно не решает ее. Лично для меня эта кросс-платформенная неразбериха внутри VBA поставила в тупик. Поэтому буду признателен за любую попытку помочь в решении проблемы.