这个问题与这个 Stack Overflow 问题但我觉得问题的核心不在于编程,而在于程序的局限性,这就是我在这里提问的原因。
我希望有人能够解释我在使用窗口调整大小事件作为某些 VBA 代码的触发器时看到的 Windows Snap 差异。
我在模块中有此代码。每次调整窗口大小时,ThisWorkbook
它都会将第一个工作表中的值加 1 :A1
Private Sub Workbook_WindowResize(ByVal Wn As Window)
Dim n As Integer
n = ThisWorkbook.Worksheets(1).Range("a1").Value
ThisWorkbook.Worksheets(1).Range("a1").Value = n + 1
End Sub
事件将要触发条件:
- 窗口最大化或最小化
- 通过向内/向外拖动边缘可以调整窗口大小
- 按键盘上的 Windows+箭头键可将窗口对齐到一侧
- 窗口(a)被捕捉到一侧是将另一个窗口(b)捕捉到一侧,然后从 Windows 捕捉助手缩略图中选择第一个窗口(a)
事件将不会触发条件:
- 通过使用鼠标将窗口拖到屏幕边缘,窗口会贴靠到一侧
- 用鼠标拖动窗口即可从一侧取消捕捉
我尝试过的方法
我已经检查过了MSDN 文档有关 Windows Resize 事件限制的更多详细信息。从该链接中可以看出,那里的信息不足以在这种情况下派上用场。
我还检查了 Stack Overflow 和 Super User,除了问题开头提到的问题之外,没有发现任何其他问题提到使用 Windows Snap 作为宏的触发器。
编辑:我也尝试了 Application_WindowResize,结果相同。
我在模块中使用了以下代码ThisWorkbook
来初始化应用程序事件:
Private WithEvents App As Application
Private Sub Workbook_Open()
Set App = Application
End Sub
关闭并重新打开工作簿后,此代码用于检查事件触发器:
Private Sub App_WindowResize(ByVal Wb As Workbook, ByVal Wn As Window)
Dim n As Integer
n = ThisWorkbook.Worksheets(1).Range("a1").Value
ThisWorkbook.Worksheets(1).Range("a1").Value = n + 1
End Sub
需要澄清的是,此代码是在新的工作簿中运行的,VBE 中不存在早期的代码。我看到的结果与上述相同,除了使用鼠标拖动和捕捉到屏幕边缘之外,事件都会触发。
谁能告诉我为什么上述情况下 Windows Resize 事件没有触发?
答案1
此后,Excel 中的 Resize 事件一直不稳定,在最新版本中也没有得到改善。在某些涉及最大化或最小化窗口的情况下,它从未完全发挥作用,而捕捉显然使用了类似的机制。
因此,解决这个问题需要直接与 Windows API 交互并拦截与调整大小相关的 Windows 消息。
方法 1:为应用程序创建新的消息泵
您可以在 Jaafar Tribak 撰写的最后一篇文章中找到完整的 VB 代码 检测 Excel 应用程序窗口的大小调整。
简而言之,您需要声明和的 Windows API 函数
FindWindow
,SetWindowLong
并使用它们查找名为的应用程序窗口XLMAIN
,并设置您自己的消息泵。然后,您拦截相关的 Windows 消息,处理它们,最后将它们传递给 Windows。整个代码太长,无法在此重现,并且根据您的需要对其进行调整需要一些 VB 和 Windows API 知识。
方法 2:使用 C DLL
对于 32 位版本的 Excel,您可以使用可 从以下位置下载的C DLL(动态加载库)SubCls.dll
和代码模块modSubCls.bas
本网站。
如何使用它们的描述可以在帖子中找到 检测窗口的调整大小事件。
最后,我想说的是,我不知道这个问题有什么简单的解决办法。我担心你需要做一些繁重的编程工作才能解决 Excel 的这些缺点。