首页 文章

Excel的Application.Hwnd属性是否可以从64位VBA使用?

提问于
浏览
2

我需要从电子表格中运行的64位VBA代码获取Excel 2013 x64窗口句柄 . 有几个选项可以做到这一点:

Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
           ByVal lpClassName As String, _
           ByVal lpWindowName As String) As LongPtr

问题是 Application.Hwnd 返回 Long ,即32位(我在64位环境中用 MsgBox TypeName(Application.Hwnd) 验证了这一点),而 FindWindow 返回 LongPtr ,在Office x64中为64位长 .

这是否意味着无法信任 Application.Hwnd 属性在64位环境中始终是正确的?

1 回答

  • 2

    这是否意味着无法信任Application.Hwnd属性在64位环境中始终是正确的?

    不,这不是真的 . LongPtr 只是一种可变数据类型,在32位版本上是4字节数据类型,在64位版本的Office 2010上是8字节数据类型 .

    你可以阅读更多关于 LongPtr Here的信息

    如果上述链接死亡......

    LongPtr (32位系统上的长整数,64位系统上的LongLong整数)变量存储为32位系统上的 -2,147,483,648 to 2,147,483,647 值的带符号32位(4字节)数字;并且在64位系统上签名为64位(8字节)的数字,范围为 -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 .

    Note

    LongPtr 不是真正的数据类型,因为它在32位环境中转换为Long,在64位环境中转换为 LongLong . 使用 LongPtr 可以写入可以在32位和64位环境中运行的 portable code . 使用 LongPtr 作为指针和句柄 .

    Suggested for further Reading

    Compatibility Between the 32-bit and 64-bit Versions of Office 2010

    来自注释的后续但是,我担心由于FindWindow可以返回更大的值,因此窗口句柄在某个阶段可能会超过32位 . 如果这是真的,那么Application.Hwnd将无法返回正确的值 . 或者你是说窗口句柄永远不会超过32位?

    以下链接精美地解释了它 . Interprocess Communication Between 32-bit and 64-bit Applications

相关问题