【AutoCAD VBA上級編】君のコードに「支配力」を。Windows APIでAutoCADを最前面に強制表示させる極意
こんにちは。現場の最前線でCADと格闘し、自動化の果てを見てきたエンジニアです。
AutoCAD VBAを使っていると、一度はこんな壁にぶつかるはずです。
「バックグラウンドで重い計算をしていて、終わった瞬間にユーザーに座標を指定させたいが、他のアプリを開いているとAutoCADが裏に隠れたままでユーザーが混乱する」
マクロの記録で満足しているレベルでは、この「フォーカス管理」という泥沼からは抜け出せません。今日は、AutoCADを強制的に「主役」の座に引き戻す、Windows APIを用いた制御の奥義を授けましょう。
—
1. なぜ「GetPoint」だけでは不十分なのか
`ThisDrawing.Utility.GetPoint` を呼ぶだけでは、実はAutoCADが「最前面」に来るとは限りません。OSのセキュリティポリシー上、勝手に他のウィンドウをアクティブにすることは制限されているからです。
ここで登場するのが、Windowsの心臓部「Windows API」です。これをVBAから叩くことで、AutoCADのウィンドウハンドル(HWND)を直接操作し、「今すぐ私を見ろ!」とOSに命令を送ります。
—
2. 魔法の呪文:Windows APIの宣言
VBAの世界に外部の力を借りるには、モジュールの冒頭でAPIを「宣言」する必要があります。以下のコードを標準モジュールの最上部にコピペしてください。
‘ AutoCADのウィンドウハンドルを取得するために必要
If Win64 Then
Private Declare PtrSafe Function SetForegroundWindow Lib “user32” (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function GetForegroundWindow Lib “user32” () As LongPtr
Else
Private Declare Function SetForegroundWindow Lib “user32” (ByVal hwnd As Long) As Long
Private Declare Function GetForegroundWindow Lib “user32” () As Long
End If
‘ AutoCADのウィンドウハンドルはApplicationオブジェクトから取得可能
【ここがポイント!】
- PtrSafe: 64bit環境でのVBAで必須のキーワードです。これがないと現代のAutoCADでは動きません。
- SetForegroundWindow: これが今回使う「強制フォーカス」の魔法の杖です。
—
3. 実践:AutoCADを強制的に手前に呼び出す関数
では、実際にAutoCADを最前面に引っ張り出し、ユーザー入力を促すプロシージャを作成しましょう。
Public Sub ForceUserInteraction()
Dim acadApp As AcadApplication
Set acadApp = ThisDrawing.Application
‘ 1. AutoCADのメインウィンドウハンドルを取得
Dim hwnd As LongPtr
hwnd = acadApp.WindowHandle
‘ 2. Windows APIを呼び出し、強制的にフォーカスを移す
‘ 戻り値が0以外なら成功
If SetForegroundWindow(hwnd) <> 0 Then
MsgBox “AutoCADを最前面に表示しました。点をクリックしてください。”
End If
‘ 3. ユーザー入力を待機(ここで処理が止まる)
On Error Resume Next ‘ キャンセル時のエラー回避
Dim pickPoint As Variant
pickPoint = ThisDrawing.Utility.GetPoint(, “画面上の点を指定してください: “)
If Err.Number = 0 Then
MsgBox “指定された座標は X:” & pickPoint(0) & ” Y:” & pickPoint(1)
Else
MsgBox “操作がキャンセルされました。”
End If
On Error GoTo 0
End Sub
—
4. 陥りやすい罠:なぜ動かないのか?
「コードは合っているはずなのに、時々フォーカスが戻らない」
そんな経験をしませんか? それには明確な理由が2つあります。
罠①:OSの制限
Windowsは、ユーザーが他のアプリを操作している最中に、別のアプリが勝手に最前面に躍り出るのを嫌います。そのため、`SetForegroundWindow` を呼んでも、タスクバーのアイコンが「ピカピカ点滅するだけ」になることがあります。これはOSの防衛本能です。
罠②:タイミングの問題
処理の直後に呼び出しすぎて、まだウィンドウの準備ができていない場合があります。もしうまくいかない時は、`DoEvents` を挟んでOSに「ちょっと待って、処理を整理させて」と伝えてください。
‘ SetForegroundWindowの直前にこれを入れるだけで安定度が段違い
DoEvents
SetForegroundWindow hwnd
—
5. 最後に:エンジニアとしての心構え
AutoCAD VBAをマスターするということは、単にメソッドを覚えることではありません。「OSとCADの間で何が起きているか」を想像する力を養うことです。
今回紹介したAPI制御は、強力な武器です。しかし、やりすぎるとユーザーは「勝手に画面が切り替わる使いにくいツールだ」と感じてしまいます。
- ユーザー入力が必要な時だけ、礼儀正しくフォーカスを奪う。
- 処理中は静かに待機する。
この「距離感」をコントロールできるのが、真に優秀な自動化エンジニアです。
さあ、君のコードでAutoCADを自在に操ってみてください。応援していますよ。
—
このブログが、あなたの開発ライフのターニングポイントになれば幸いです。また次の深淵でお会いしましょう。
