AutoCAD VBA 非模态窗体焦点处理

引用的win32 api

Option Explicit
Declare PtrSafe Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Declare PtrSafe Function CoCreateGuid Lib "ole32.dll" (G As GUID) As Long
Declare PtrSafe Function StringFromGUID2 Lib "ole32.dll" (G As GUID, ByVal str As String, ByVal cchMax As Long) As Long
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare PtrSafe Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type
Private Function GetGUID() As String
Dim G As GUID
Dim S As String
S = String(76, vbNullChar)
CoCreateGuid G
StringFromGUID2 G, S, Len(S)
S = StrConv(S, vbFromUnicode)
GetGUID = S
End Function
Public Function GetUserFormHandle(ByVal UF As Object)
Dim S As String
Dim OrigCaption As String
S = GetGUID()
OrigCaption = UF.Caption
UF.Caption = S
GetUserFormHandle = FindWindow(vbNullString, S)
UF.Caption = OrigCaption
End Function

窗体里面的处理

 

Option Explicit
Private CurUserFormHwnd As Long
Private Sub CommandButton1_Click()
Me.Hide
VBA.AppActivate ThisDrawing.Application.Caption
Dim pt As Variant
pt = ThisDrawing.Utility.GetPoint(, "pick a point")
ThisDrawing.ModelSpace.AddCircle pt, VBA.Val(Me.TextBox1.Text)
ThisDrawing.Regen acActiveViewport
Me.show 0
Win32Api.SetParent CurUserFormHwnd, CLng(AcadApplication.hwnd)
End Sub
Private Sub UserForm_Initialize()
CurUserFormHwnd = Win32Api.GetUserFormHandle(Me)
Win32Api.SetParent CurUserFormHwnd, CLng(AcadApplication.hwnd)
End Sub

视频效果

https://www.bilibili.com/video/BV1jE421P7tP/

 

posted @   南胜NanSheng  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示