1

Solidworks でいくつかのことを自動化する VBA 7.0 プログラムを作成しました。私がしなければならないことの 1 つは、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
4

1 に答える 1

2

うまくいかないもののように聞こえます。モーダル ダイアログ ボックスは、独自のイベント ループを実行し、その親を無効にし、マウスをキャプチャする場合があります。すぐに問題が発生します。それが同じように機能することに驚いています。

より良い解決策は、非モーダル ダイアログ ボックスまたはダイアログとして作成されたアプリです。あなたはそれを「上に」作ることができるので、彼らがそれを消す準備が整うまでそこに座っているだけです.


非モーダル ダイアログ ボックスは、CreateDialog() で作成されます。このようなもの: http://www.winprog.org/tutorial/modeless_dialogs.html . 最上位はスタイルです: WS_EX_TOPMOST。それを VB に変換することはできません。

于 2014-11-06T05:00:48.520 に答える