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

时间:2015-05-22 12:55:25

标签: excel vba excel-vba 64-bit window-handles

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

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

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

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

1 个答案:

答案 0 :(得分:4)

  

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

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

您可以阅读有关LongPtr Here

的更多信息

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

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

注意

LongPtr不是真正的数据类型,因为它在32位环境中转换为Long,在64位环境中转换为LongLong。使用LongPtr可以编写可以在32位和64位环境中运行的可移植代码。使用LongPtr作为指针和句柄。

建议进一步阅读

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