Я написал программу VBA 7.0, которая автоматизирует некоторые вещи в Solidworks. Одна из вещей, которые мне нужно сделать, это проверить наличие опечаток в нескольких областях документа Solidworks. Что я сделал, так это использовал API-вызов MessageBoxW для отображения системного модального окна сообщения, чтобы у них была возможность исправить опечатку, прежде чем продолжить, или отменить.
Окно сообщений отображается нормально, и я могу войти в работающее приложение Solidworks и работать в нем, но когда я щелкаю правой кнопкой мыши в программе и пытаюсь использовать контекстное меню ПКМ, начинают происходить некоторые странные вещи.
1) Мышь кнопки больше не работают в программе или в окне сообщений. Окна других приложений продолжают нормально реагировать, но любые щелчки мышью (ПКМ или ЛКМ) в любом месте окна приложения Solidworks или в окне сообщения ничего не дают. Окна не зависают - я могу нажать клавишу выхода, чтобы выйти из контекстного меню, и тогда все работает нормально. Щелчки кнопки мыши просто не регистрируются, пока открыто контекстное меню. 2) Контекстное меню ПКМ "становится системным модальным". Я не уверен, что это то, что происходит, но лучший способ, которым я мог придумать, чтобы описать это. По сути, контекстное меню будет отображаться поверх всех других окон приложений. Я все еще могу работать в других окнах, хотя и без каких-либо негативных эффектов, кроме контекстного меню.
Не уверен, что это проблема с Solidworks, функцией MessageBoxW или их комбинацией.
РЕДАКТИРОВАТЬ: Это происходит ТОЛЬКО во время отображения окна сообщения, когда закрытое поведение является нормальным.
Я вызываю функции API следующим образом:
lngReply=WinMsgBox(Prompt:="Can you do this thing for me? blah blah",Title:="Action required",Buttons:=vbOkCancel + vbInformation + vbSystemModal
Option Explicit
Private Declare PtrSafe Function MessageBoxW Lib "User32" _
(Optional ByVal hWnd As Long, _
Optional ByVal Prompt As LongPtr, _
Optional ByVal Title As LongPtr, _
Optional ByVal Buttons As Long) _
As Long
Public Function WinMsgBox(Optional ByRef hWnd As Long, _
Optional ByRef Prompt As String, _
Optional ByRef Title As String, _
Optional ByRef Buttons As Long) _
As Long
WinMsgBox = MessageBoxW(hWnd, StrPtr(Prompt), StrPtr(Title), Buttons)
End Function