使用鼠标将窗口贴靠到屏幕边缘时不会触发窗口调整大小事件

使用鼠标将窗口贴靠到屏幕边缘时不会触发窗口调整大小事件

这个问题与这个 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 函数 FindWindowSetWindowLong并使用它们查找名为的应用程序窗口XLMAIN,并设置您自己的消息泵。然后,您拦截相关的 Windows 消息,处理它们,最后将它们传递给 Windows。整个代码太长,无法在此重现,并且根据您的需要对其进行调整需要一些 VB 和 Windows API 知识。

方法 2:使用 C DLL

对于 32 位版本的 Excel,您可以使用可 从以下位置下载的C DLL(动态加载库)SubCls.dll和代码模块modSubCls.bas本网站

如何使用它们的描述可以在帖子中找到 检测窗口的调整大小事件

最后,我想说的是,我不知道这个问题有什么简单的解决办法。我担心你需要做一些繁重的编程工作才能解决 Excel 的这些缺点。

相关内容