Excel 的 Application.Hwnd 属性 可以从 64 位 VBA 开始使用吗?

Is Excel's Application.Hwnd property usable from 64 bit VBA?

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

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

问题是 Application.Hwnd returns 一个 Long,即 32 位(我已经在 64 位环境中用 MsgBox TypeName(Application.Hwnd) 验证了这一点),而 FindWindow returns a LongPtr,在 Office x64 中是 64 位长。

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

Does this mean that the Application.Hwnd property can't be trusted to always be correct in a 64 bit environment?

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

您可以阅读更多关于 LongPtr Here

万一上面的link死了...

LongPtrLong integer on 32-bit systems, LongLong integer on 64-bit systems)变量存储为带符号的 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

Followup from comments

However, I'm worried that since FindWindow can return a larger value, a window handle may exceed 32 bits at some stage. And if that's true, then Application.Hwnd would be unable to return the correct value. Or are you saying that a window handle will never exceed 32 bits?

下面link解释得很漂亮。 Interprocess Communication Between 32-bit and 64-bit Applications