VBA PowerPoint 中所有幻灯片 windows 前面的用户表单
VBA userform that is in front of all slide show windows of PowerPoint
我是 运行 PowerPoint 启用宏的幻灯片放映。当用户打开此文件时,演示会立即开始。演示文稿包含各种形状,当按下(使用链接)时,将在主幻灯片放映前打开一个新的 Powerpoint 幻灯片放映。
我在后台使用 VBA(代码位于启用宏的主幻灯片中)来衡量用户在所有幻灯片上花费的时间。我希望用户能够使用用户表单和按钮停止此计时器。但是,当打开新的 Powerpoint 幻灯片时,它会出现在主幻灯片的前面。用户窗体将在新幻灯片放映后消失。使用第二个屏幕我已经能够查看用户表单。但是当点击用户窗体时,它会将主幻灯片放映在另一个幻灯片放映之前。
简而言之:我想要一个位于所有幻灯片放映前面的用户表单 windows。
我尝试使用 vbmodeless 但这没有帮助。我还尝试了各种代码:
- http://www.vbaexpress.com/forum/showthread.php?58189-Make-userform-stay-on-top-of-all-windows-when-macro-is-fired
- https://www.mrexcel.com/board/threads/userform-always-on-top.386643/
- https://www.mrexcel.com/board/threads/keeping-userform-on-top-when-changing-active-workbook.1165439/
不幸的是,其中 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
我是 运行 PowerPoint 启用宏的幻灯片放映。当用户打开此文件时,演示会立即开始。演示文稿包含各种形状,当按下(使用链接)时,将在主幻灯片放映前打开一个新的 Powerpoint 幻灯片放映。
我在后台使用 VBA(代码位于启用宏的主幻灯片中)来衡量用户在所有幻灯片上花费的时间。我希望用户能够使用用户表单和按钮停止此计时器。但是,当打开新的 Powerpoint 幻灯片时,它会出现在主幻灯片的前面。用户窗体将在新幻灯片放映后消失。使用第二个屏幕我已经能够查看用户表单。但是当点击用户窗体时,它会将主幻灯片放映在另一个幻灯片放映之前。
简而言之:我想要一个位于所有幻灯片放映前面的用户表单 windows。
我尝试使用 vbmodeless 但这没有帮助。我还尝试了各种代码:
- http://www.vbaexpress.com/forum/showthread.php?58189-Make-userform-stay-on-top-of-all-windows-when-macro-is-fired
- https://www.mrexcel.com/board/threads/userform-always-on-top.386643/
- https://www.mrexcel.com/board/threads/keeping-userform-on-top-when-changing-active-workbook.1165439/
不幸的是,其中 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