R H*_*ann 2 excel 64-bit vba window-handles excel-vba
我需要从电子表格中运行的64位VBA代码中获取Excel 2013 x64窗口句柄。有两个选项可以做到这一点:
Application.Hwnd
(MSDN Application.Hwnd属性(Excel))声明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位环境中总是正确的?
这是否意味着
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,647
32位系统上;和带符号的64位(8字节)数字,其值的范围从-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
64位系统上开始。
注意
LongPtr
不是真正的数据类型,因为它在32位环境或LongLong
64位环境中会转换为Long 。通过使用,LongPtr
可以编写可在32位和64位环境中运行的可移植代码。使用LongPtr
了指针和手柄。
建议进一步阅读:
评论的跟进
但是,我担心由于FindWindow可以返回更大的值,因此窗口句柄在某个阶段可能会超过32位。如果是这样,那么Application.Hwnd将无法返回正确的值。还是说窗口句柄永远不会超过32位?
以下链接对此进行了漂亮的解释。 32位和64位应用程序之间的进程间通信