我编写了一个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
答案 0 :(得分:1)
听起来像是无法正常工作的东西。模态对话框运行自己的事件循环,禁用其父级并可以捕获鼠标。麻烦就行了。我很惊讶它的效果和它一样好。
更好的解决方案是非模态对话框或作为对话框编写的应用程序。你可以把它“放在首位”,这样它就可以坐在那里直到它们准备好让它消失。
使用CreateDialog()创建非模态对话框。这样的事情:http://www.winprog.org/tutorial/modeless_dialogs.html。最顶层的是样式:WS_EX_TOPMOST。 我无法帮助将其变成VB。