You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:36:08