VBA PowerPoint 中所有幻灯片 windows 前面的用户表单

VBA userform that is in front of all slide show windows of PowerPoint

我是 运行 PowerPoint 启用宏的幻灯片放映。当用户打开此文件时,演示会立即开始。演示文稿包含各种形状,当按下(使用链接)时,将在主幻灯片放映前打开一个新的 Powerpoint 幻灯片放映。

我在后台使用 VBA(代码位于启用宏的主幻灯片中)来衡量用户在所有幻灯片上花费的时间。我希望用户能够使用用户表单和按钮停止此计时器。但是,当打开新的 Powerpoint 幻灯片时,它会出现在主幻灯片的前面。用户窗体将在新幻灯片放映后消失。使用第二个屏幕我已经能够查看用户表单。但是当点击用户窗体时,它会将主幻灯片放映在另一个幻灯片放映之前。

简而言之:我想要一个位于所有幻灯片放映前面的用户表单 windows。

我尝试使用 vbmodeless 但这没有帮助。我还尝试了各种代码:

不幸的是,其中 none 似乎有效。其中一些是针对 excel 的,我无法重写这些代码。

P.S。如果这不可能,也许我可以隐藏主幻灯片放映?

简单版
创建一个 class 模块 MyClass,并将此代码放在那里:

Public WithEvents App As Application
Private Sub App_SlideShowBegin(ByVal Wn As SlideShowWindow)
    UserForm1.Show False
End Sub

创建一个模块并将此代码放入其中:

Dim MyThing As New MyClass
Sub InitializeApp()
    Set MyThing.App = Application
End Sub

运行先用InitializeApp方法。现在,当您开始演示时,您的 UserForm1 将出现。 False 标志使它成为非模态的,这就是我认为你正在寻找的。

稍微高级一点的版本
如上,但将模块更改为:

Option Explicit

Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1

Public Const HWND_TOP = 0
Public Const HWND_BOTTOM = 1
Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2

Public Declare Function SetWindowPos Lib "user32" _
    (ByVal hWnd As Long, _
    ByVal hWndInsertAfter As Long, _
    ByVal X As Long, _
    ByVal Y As Long, _
    ByVal cx As Long, _
    ByVal cy As Long, _
    ByVal uFlags As Long) As Long

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long


Dim MyThing As New MyClass
Sub InitializeApp()
    Set MyThing.App = Application
End Sub

并将此添加到您的表单代码中:

Option Explicit

Option Explicit

Private Sub UserForm_Initialize()
    Dim formHWnd As Long
    formHWnd = FindWindow("ThunderDFrame", Me.Caption)
    SetWindowPos formHWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
End Sub