我需要从电子表格中运行的64位VBA代码中获取Excel 2013 x64窗口句柄。有几个选项可以做到这一点:
Application.Hwnd
(MSDN Application.Hwnd Property (Excel))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位环境中始终是正确的?
答案 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