1

我编写了一个 VBA 7.0 程序,它可以在 Solidworks 中自动执行一些操作。我必须做的一件事是检查 Solidworks 文档中几个区域的拼写错误。我所做的是使用对 MessageBoxW 的 API 调用来显示系统模式消息框,以便他们有机会在继续或取消之前修复错字。

消息框显示正常,我可以进入正在运行的 Solidworks 应用程序并在其中工作,但是当我在程序中右键单击并尝试使用 RMB 上下文菜单时,开始发生一些奇怪的事情。
1) 鼠标按钮在程序中或消息框窗口上不再起作用。其他应用程序窗口继续正常响应,但在 Solidworks 应用程序窗口或消息框窗口中的任何位置单击鼠标(RMB 或 LMB)均无反应。窗口没有冻结 - 我可以按退出键退出上下文菜单,然后一切正常。当上下文菜单启动时,鼠标按钮单击似乎没有注册。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
4

1 回答 1

2

听起来像是无法正常工作的东西。模态对话框运行自己的事件循环,禁用其父级并可能捕获鼠标。麻烦就下线了。我很惊讶它的效果和它一样好。

更好的解决方案是非模态对话框或以对话框形式编写的应用程序。你可以让它“在上面”,所以它就坐在那里,直到他们准备好让它消失。


使用 CreateDialog() 创建一个非模式对话框。像这样的东西:http: //www.winprog.org/tutorial/modeless_dialogs.html。最上面的是一个样式:WS_EX_TOPMOST。我忍不住把它变成了VB。

于 2014-11-06T05:00:48.520 回答