在Solidworks应用程序中右键单击时出现系统模式MessageBoxW问题

时间:2014-11-05 22:13:25

标签: vba winapi modal-dialog solidworks

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

消息框显示正常,我可以进入正在运行的Solidworks应用程序并在其中工作,但是当我在程序中右键单击并尝试使用RMB上下文菜单时,会发生一些奇怪的事情。
1)鼠标按钮不再在程序内或消息框窗口中工作。其他应用程序窗口继续响应很好,但在Solidworks应用程序窗口或消息框窗口中的任何位置任何鼠标单击(RMB或LMB)都不会执行任何操作。窗口没有冻结 - 我可以点击退出键退出上下文菜单,然后一切正常。上下文菜单启动时,鼠标按钮单击似乎没有注册。 2)RMB上下文菜单“成为系统模态”。我不确定这是不是发生了什么,但最好的方式是我能想到来描述它。基本上,上下文菜单将显示在所有其他应用程序窗口的顶部。我仍然可以在其他窗口中工作,除了上下文菜单之外没有任何负面影响。

不确定这是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

1 个答案:

答案 0 :(得分:1)

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

更好的解决方案是非模态对话框或作为对话框编写的应用程序。你可以把它“放在首位”,这样它就可以坐在那里直到它们准备好让它消失。


使用CreateDialog()创建非模态对话框。这样的事情:http://www.winprog.org/tutorial/modeless_dialogs.html。最顶层的是样式:WS_EX_TOPMOST。 我无法帮助将其变成VB。