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

R H*_*ann 2 excel 64-bit vba window-handles excel-vba

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

    声明PtrSafe函数FindWindow库“ user32”别名“ FindWindowA”(_
           ByVal lpClassName作为字符串,_
           ByVal lpWindowName As String)As LongPtr

问题是Application.Hwnd返回a Long,即32位(我已经MsgBox TypeName(Application.Hwnd)在64位环境中对此进行了验证),而FindWindow返回a LongPtr,在Office x64中它的长度为64位。

这是否意味着Application.Hwnd不能信任该属性在64位环境中总是正确的?

Sid*_*out 5

这是否意味着Application.Hwnd不能信任该属性在64位环境中总是正确的?

不,那不是真的。的LongPtr仅仅是一个变量数据类型,是在32位版本的4个字节的数据类型和在Office 2010的64位版本的一个8字节的数据类型。

您可以在此处了解更多信息LongPtr

万一以上链接消失了...

LongPtr在32位系统上为Long integer,在64位系统上为LongLong整数)变量存储为带符号的32位(4字节)数字,其值的范围在-2,147,483,648 to 2,147,483,64732位系统上;和带符号的64位(8字节)数字,其值的范围从-9,223,372,036,854,775,808 to 9,223,372,036,854,775,80764位系统上开始。

注意

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

建议进一步阅读

Office 2010的32位和64位版本之间的兼容性

评论的跟进

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

以下链接对此进行了漂亮的解释。 32位和64位应用程序之间的进程间通信