Excel的Application.Hwnd属性是否可用于64位VBA?
我需要从电子表格中运行的64位VBA代码获取Excel 2013 x64窗口句柄。 有几个选项可以做到这一点:
- 阅读
Application.Hwnd
( MSDN Application.Hwnd属性(Excel) ) - 调用从user32导入的FindWindow,例如在此处接受的答案中所述: VBA 6.0和VBA 7.0之间有什么区别? :
声明PtrSafe函数FindWindow Lib“user32”别名“FindWindowA”(_ ByVal lpClassName As String,_ ByVal lpWindowName As String)As LongPtr
问题是, Application.Hwnd
返回一个Long
,即32位(我在64位环境中用MsgBox TypeName(Application.Hwnd)
validation了这一点),而FindWindow
返回一个LongPtr
,在Office x64中是64位长。
这是否意味着Application.Hwnd
属性不能被信任在64位环境中总是正确的?
这是否意味着
Application.Hwnd
属性不能被信任在64位环境中总是正确的?
不,那不是真的。 LongPtr
只是一种可变数据types,它是32位版本上的4字节数据types和Office 2010的64位版本上的8字节数据types。
你可以在这里阅读更多关于LongPtr
万一上述链接死亡…
LongPtr
( 32位系统上的长整数,64位系统上的LongLong整数 )variables存储为32 位系统上有符号的32位( 4字节 )数值,范围从-2,147,483,648 to 2,147,483,647
; 并在64位系统上签署了价值从-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
的64位( 8字节 )数字。
注意
LongPtr
不是真正的数据types,因为它在32位环境中转换为Long或在64位环境中转换为LongLong
。 使用LongPtr
可以编写可在32位和64位环境下运行的可移植代码 。 使用LongPtr
指针和句柄。
build议进一步阅读 :
Office 2010的32位和64位版本之间的兼容性
从评论后续
不过,我担心,由于FindWindow可以返回一个更大的值,窗口句柄可能会在某个阶段超过32位。 如果这是真的,那么Application.Hwnd将无法返回正确的值。 还是你说窗口句柄永远不会超过32位?
以下链接精美地解释它。 32位和64位应用程序之间的进程间通信