我编写了一个VBA7.0程序,它在Solidworks中自动化了一些事情。我必须做的一件事是检查Solidworks文档中几个区域的输入。我所做的是使用对MessageBoxW的API调用来显示一个系统模式消息框,这样他们就有机会在继续或取消之前修复错误。
messagebox显示得很好,我可以进入运行中的Solidworks应用程序并在其中工作,但是当我在程序中右键单击并尝试使用人民币上下文菜单时,一些奇怪的事情就开始发生了。
1)鼠标按钮不再在程序中工作或在messagebox窗口上工作。其他应用程序窗口继续响应良好,但是任何鼠标单击(人民币或LMB)在Solidworks应用程序窗口或messagebox窗口中的任何地方都没有任何作用。窗口没有冻结-我可以按转义键退出上下文菜单,然后一切正常工作。当上下文菜单打开时,鼠标按钮单击似乎没有注册。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发布于 2014-11-06 05:00:48
听起来像是无法工作的东西。模式对话框运行自己的事件循环,禁用父对话框并可能捕获鼠标。麻烦接踵而至。我很惊讶它的效果和它一样好。
一个更好的解决方案将是一个非模态对话框或一个应用程序写成一个对话框。你可以让它“在上面”,所以它只是坐在那里,直到他们准备好让它消失。
使用CreateDialog()创建一个非模式对话框。就像这样:dialogs.html。最上面是一种风格: WS_EX_TOPMOST。我情不自禁地把它变成VB。
https://stackoverflow.com/questions/26768154
复制相似问题