GetWindowRect函数获取SolidWorks窗口坐标返回全零值问题求助
解决SolidWorks窗口GetWindowRect返回全零的问题
问题分析
你遇到的核心问题是FindWindow获取的句柄并非SolidWorks实际负责显示的主窗口,虽然GetWindowRect返回执行成功,但该句柄对应的窗口RECT确实为0。SolidWorks的窗口结构存在嵌套,外层容器窗口可能没有实际显示区域,导致坐标全零。
解决方案
方法1:通过SolidWorks API直接获取正确句柄
这是最可靠的方式,利用SolidWorks自身的API获取主窗口句柄,避免FindWindow的不确定性:
Private Declare PtrSafe Function GetWindowRect Lib "user32" ( _ ByVal hwnd As LongPtr, _ lpRect As RECT _ ) As Long Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Public Sub GetSolidWorksWindowRect() Dim swApp As Object Dim hwnd As LongPtr Dim windowRect As RECT Dim result As Long ' 获取运行中的SolidWorks实例 Set swApp = GetObject(, "SldWorks.Application") If swApp Is Nothing Then MsgBox "SolidWorks未运行" Exit Sub End If ' 获取SolidWorks主窗口句柄 hwnd = swApp.GetHWnd() ' 调用GetWindowRect获取坐标 result = GetWindowRect(hwnd, windowRect) ' 输出结果到立即窗口 Debug.Print "窗口坐标信息:" Debug.Print "Left: " & windowRect.Left Debug.Print "Top: " & windowRect.Top Debug.Print "Right: " & windowRect.Right Debug.Print "Bottom: " & windowRect.Bottom Debug.Print "函数返回值:" & result Debug.Print "系统错误码:" & Err.LastDllError End Sub
方法2:修正FindWindow的参数(备选)
如果必须使用FindWindow,需确保传入正确的SolidWorks主窗口类名(可通过Spy++工具查看),SolidWorks主窗口的类名通常为SW_MAIN_FRAME,调用时忽略窗口标题(因为标题会随打开文档变化):
' 调用示例 Call swWindow("SW_MAIN_FRAME", vbNullString)
额外说明
- 若在高DPI缩放环境下,GetWindowRect返回的是物理像素坐标,如需转换为逻辑坐标,可结合
GetDpiForWindow函数进行计算。 - 你的原代码中
RECT结构的right成员为小写,虽然VBA对大小写不敏感,但建议统一为Right以符合Windows API的规范命名。
内容的提问来源于stack exchange,提问作者Anthony Meeks
相关产品推荐
相关产品推荐

