- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我在 Excel 中的窗口之间切换时,我可以看到在各个级别触发 WindowActivate
事件,但是当 excel 成为前台应用程序时有没有办法触发事件?如果我单击 Excel 并工作,例如在浏览器中运行一段时间,然后单击返回 Excel 窗口,我不会看到任何事件触发。有什么办法可以检测到吗?
我想刷新 VBA 应用程序的某些元素,因为有时我发现基于超文本功能的鼠标悬停功能失去了激活图表的能力。我可以通过取消保护和保护工作表,或者通过废弃并重新初始化对象的子集来修复它。我想在我正在寻找的事件上触发此操作。
我也可以通过 SendKeys
来做到这一点,但这并不好,因为它会由于 SendKeys
中记录的错误而清除键盘设置(例如滚动锁定),并且它使得屏幕闪烁超出了我的预期。
由于代码将驻留在 VBA 中,我会将操作限制在特定的工作簿中。如果进入 Excel 实例窗口时另一个(被动)工作簿处于事件状态,则不会触发任何操作,并且当用户选择包含它的工作簿时,我可以使用 WorkbookActivate
事件刷新应用程序。
最佳答案
我相信 Excel 中没有直接提供此功能,因此请使用 Windows API。您可以使用 VBA 进行 win32 编程!
可以使用win32 api函数SetWinEventHook让 Windows 向您报告某些事件。包括前台窗口变化时触发的EVENT_SYSTEM_FOREGROUND。在下面的示例中,我根据 Excel 的进程 ID 检查新前台窗口的进程 ID。这是一种简单的方法,但它会像主 Excel 窗口一样检测其他 Excel 窗口,例如 VBA 窗口。这可能是也可能不是您想要的行为,并且可以进行相应的更改。
使用 SetWinEventHook 时必须小心,因为您向它传递了回调函数。您在此回调函数中可以执行的操作受到限制,它存在于 VBA 的正常执行之外,并且其中的任何错误都会导致 Excel 以困惑且不可恢复的方式崩溃。
这就是我使用 Application.OnTime 来报告事件的原因。如果多个事件的触发速度比 Excel 和 VBA 更新更快,则不保证它们按顺序发生。但这样更安全。您还可以更新事件集合或数组,然后在 WinEventFunc 回调之外单独读回这些事件。
要对此进行测试,请创建一个新模块并将此代码粘贴到其中。然后运行StartHook。 请记住在关闭 Excel 或修改代码之前运行 StopAllEventHooks!! 在生产代码中,您可能会将 StartEventHook 和 StopAllEventHooks 添加到 WorkBook_Open 和 WorkBook_BeforeClose 事件中,以确保它们在适当的时间运行。请记住,如果在 Hook 停止之前 WinEventFunc VBA 代码发生问题,Excel 将崩溃。这包括正在修改的代码或正在关闭的代码所在的工作簿。当 Hook 处于事件状态时,也不要按 VBA 中的停止按钮。停止按钮可以删除当前程序状态!
Option Explicit
Private Const EVENT_SYSTEM_FOREGROUND = &H3&
Private Const WINEVENT_OUTOFCONTEXT = 0
Private Declare Function SetWinEventHook Lib "user32.dll" (ByVal eventMin As Long, ByVal eventMax As Long, _
ByVal hmodWinEventProc As Long, ByVal pfnWinEventProc As Long, ByVal idProcess As Long, _
ByVal idThread As Long, ByVal dwFlags As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private pRunningHandles As Collection
Public Function StartEventHook() As Long
If pRunningHandles Is Nothing Then Set pRunningHandles = New Collection
StartEventHook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, 0&, AddressOf WinEventFunc, 0, 0, WINEVENT_OUTOFCONTEXT)
pRunningHandles.Add StartEventHook
End Function
Public Sub StopEventHook(lHook As Long)
Dim LRet As Long
If lHook = 0 Then Exit Sub
LRet = UnhookWinEvent(lHook)
End Sub
Public Sub StartHook()
StartEventHook
End Sub
Public Sub StopAllEventHooks()
Dim vHook As Variant, lHook As Long
For Each vHook In pRunningHandles
lHook = vHook
StopEventHook lHook
Next vHook
End Sub
Public Function WinEventFunc(ByVal HookHandle As Long, ByVal LEvent As Long, _
ByVal hWnd As Long, ByVal idObject As Long, ByVal idChild As Long, _
ByVal idEventThread As Long, ByVal dwmsEventTime As Long) As Long
'This function is a callback passed to the win32 api
'We CANNOT throw an error or break. Bad things will happen.
On Error Resume Next
Dim thePID As Long
If LEvent = EVENT_SYSTEM_FOREGROUND Then
GetWindowThreadProcessId hWnd, thePID
If thePID = GetCurrentProcessId Then
Application.OnTime Now, "Event_GotFocus"
Else
Application.OnTime Now, "Event_LostFocus"
End If
End If
On Error GoTo 0
End Function
Public Sub Event_GotFocus()
Sheet1.[A1] = "Got Focus"
End Sub
Public Sub Event_LostFocus()
Sheet1.[A1] = "Nope"
End Sub
关于excel - 检测(在 VBA 中)包含 Excel 实例的窗口何时变为事件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20486944/
https://github.com/mattdiamond/Recorderjs/blob/master/recorder.js中的代码 我不明白 JavaScript 语法,比如 (functio
在 iOS 7 及更早版本中,如果我们想在应用程序中找到 topMostWindow,我们通常使用以下代码行 [[[UIApplication sharedApplication] windows]
我已经尝试解决这个问题很长一段时间了:我无法访问窗口的 url,因为它位于另一个域上..有一些解决方案吗? function login() { var cb = window.ope
是否可以将 FFMPEG 视频流传递到 C# 窗口?现在它在新窗口中作为新进程打开,我只是想将它传递给我自己的 SessionWindow。 此时我像这样执行ffplay: public void E
我有一个名为 x 的矩阵看起来像这样: pTime Close 1 1275087600 1.2268 2 1275264000 1.2264 3 1275264300 1.2
在编译时,发生搜索,grep搜索等,Emacs会在单独的窗口中创建一个新的缓冲区来显示结果,有没有自动跳转到那个窗口的方法?这很有用,因为我可以使用 n 和 p 而不是 M-g n 和 M-g p 移
我有一个启动 PowerShell 脚本的批处理文件。 批处理文件: START Powershell -executionpolicy RemoteSigned -noexit -file "MyS
我有一个基于菜单栏的应用程序,单击图标时会显示一个窗口。在 Mac OS X Lion 上一切正常,但由于某种原因,在 Snow Leopard 和早期版本的 Mac OS X 上会出现错误。任何时候
在 macOS 中,如何在 Xcode 和/或 Interface Builder 中创建带有“集成标题栏和工具栏”的窗口? 这是“宽标题栏”类型的窗口,已添加到 OS X 10.10 Yosemit
在浏览器 (Chrome) 中 JavaScript: var DataModler = { Data: { Something: 'value' }, Process: functi
我有 3 个 html 页面。第 1 页链接到第 2 页,第 2 页链接到第 3 页(为了简单起见)。 我希望页面 2 中的链接打开页面 3 并关闭页面 1(选项卡 1)。 据我了解,您无法使用 Ja
当点击“创建节点”按钮时,如何打开一个新的框架或窗口?我希望新框架包含一个文本字段和下拉菜单,以便用户可以选择一个选项。 Create node Search node
我有一个用户控件,用于编辑应用程序中的某些对象。 我最近遇到一个实例,我想弹出一个新的对话框(窗口)来托管此用户控件。 如何实例化新窗口并将需要设置的任何属性从窗口传递到用户控件? 感谢您的宝贵时间。
我有一个Observable,它发出许多对象,我想使用window或buffer操作对这些对象进行分组。但是,我不想指定count参数来确定窗口中应包含多少个对象,而是希望能够使用自定义条件。 例如,
我有以下代码,它打开一个新的 JavaFX 阶段(我们称之为窗口)。 openAlertBox.setOnAction(e -> { AlertBox alert = AlertBox
我要添加一个“在新窗口中打开”上下文菜单项,该菜单项将以新的UIScene打开我的应用程序文档之一。当然,我只想在实际上支持多个场景的设备上显示该菜单项。 目前,我只是在检查设备是否是使用旧设备的iP
我正在尝试创建一个 AIR 应用程序来记录应用程序的使用情况,使用 AIR 从系统获取信息的唯一简单方法是使用命令行工具和抓取 标准输出 . 我知道像 这样的工具顶部 和 ps 对于 OS X,但它们
所以我有这个简单的 turtle 螺旋制作器,我想知道是否有一种方法可以打印出由该程序创建的我的设计副本。 代码: import turtle x= float(input("Angle: ")) y
我正在编写一个 C# WPF 程序,它将文本消息发送到另一个程序的窗口。我有一个宏程序作为我的键盘驱动程序 (Logitech g15) 的一部分,它已经这样做了,尽管它不会将击键直接发送到进程,而是
我尝试使用以下代码通过 UDP 发送,但得到了奇怪的结果。 if((sendto(newSocket, sendBuf, totalLength, 0, (SOCKADDR *)&sendAd
我是一名优秀的程序员,十分优秀!