【问题标题】:Determine if Excel instance and Workbook has focus确定 Excel 实例和工作簿是否具有焦点
【发布时间】:2020-04-16 06:43:01
【问题描述】:

我有一个通过Application.OnTime 预定调用调用的子例程。

如何使用 Excel VBA 确定子例程的工作簿是否是 Windows 中的重点应用程序/进程?

(如果它不是活动的应用程序,那么我将运行一个代码来阻止进程一点点。如果它是活动的,我不想这样做,因为我可能正在做我不做的工作簿中的工作不想被打扰。)

【问题讨论】:

  • ActiveWorkbook.Name?理想情况下,您的代码中的对象将使用工作簿对象进行适当的限定,因此您不必担心哪个工作簿处于活动状态。
  • If ActiveWorkbook Is ThisWorkbook Then
  • @TimWilliams 如果我切换到另一个应用程序,这将不起作用。例如,如果我点击 Chrome,VBA 仍然认为ActiveWorkbook Is ThisWorkbook
  • 根据您对 Tim 的回复,您将需要使用一些 Windows API 来确定焦点窗口应用程序。请更新您的问题以反映这一点。
  • @SamuelEverson – 我尽我所能更新了我的问题文本以反映这一点。你的意思是我应该添加一个或多个标签吗?

标签: excel vba


【解决方案1】:

试试这个。我测试了它,它似乎可以工作。

在模块级别:

Declare PtrSafe Function GetActiveWindow Lib "user32" () As Long

出于测试目的,我写了这两个子:

Sub Test()
    If GetActiveWindow <> 0 Then
          'Application in focus
          Debug.Print "Focus"
    Else
          'Application not in focus
          Debug.Print " No focus"
    End If
End Sub

Sub Timer()
    Application.OnTime Procedure:="Test", EarliestTime:=Now + TimeValue("00:00:10")
End Sub

现在,试试这样:

  1. 运行定时器(例如从即时窗口)。
  2. 在计时器达到设置的 10 秒之前,切换到另一个应用程序,例如您的互联网浏览器。稍等片刻完成。
  3. 查看控制台显示的内容:
    • 如果您停留在 Excel 窗口,控制台将显示“Focus”。
    • 如果您切换窗口,它会显示“无焦点”。

【讨论】:

猜你喜欢
  • 2019-01-02
  • 2017-05-29
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多