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

万一上述链接死亡…

LongPtr32位系统上的长整数,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位应用程序之间的进程间通信