【问题标题】:Macro for disabling ESC key in PowerPoint slide show用于在 PowerPoint 幻灯片放映中禁用 ESC 键的宏
【发布时间】:2020-10-29 05:32:39
【问题描述】:

我正在使用 Office 2016,我想做一个 PowerPoint 演示文稿,在该演示文稿中,您无法仅通过按 ESC 键退出幻灯片放映,因此您只能通过鼠标与幻灯片交互(或最终使用组合键退出它,但不只是单击 ESC )。 Kiosk 模式完成了大部分工作,但仍然可以使用 ESC。我知道 NoEsc 插件,但它对我不起作用。它只是没有在功能区或其他地方显示该菜单,但其他加载项会显示在“查看”选项卡旁边的“加载项”选项卡中。所以我在其他网站上找到了用于键盘禁用宏的代码,但它仅适用于 32 -bit 并且不能在 64 位上运行。我不是编码员,所以我需要一点帮助,我怎样才能让它在 64 位或 32+64 位上工作。

这是来自网站的原始代码:

Option Explicit
 
'Esc Disable Key
Private Const WH_KEYBOARD_LL = 13&
Private Const HC_ACTION = 0&
Private Const VK_ESCAPE = &H1B
 
Private Type KBDLLHOOKSTRUCT
  vkCode As Long
  scanCode As Long
  flags As Long
  time As Long
  dwExtraInfo As Long
End Type
   Dim Response As Integer
 
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Declare Sub CopyMemory Lib "Kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal cb As Long)
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Public m_hDllKbdHook As Long
 
 Public Sub hookup()
 Call UnhookWindowsHookEx(m_hDllKbdHook)
 m_hDllKbdHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0&)
 End Sub
 
Public Function LowLevelKeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Static kbdllhs As KBDLLHOOKSTRUCT
 
If nCode = HC_ACTION Then
      Call CopyMemory(kbdllhs, ByVal lParam, Len(kbdllhs))
     If (kbdllhs.vkCode = VK_ESCAPE) Then
       LowLevelKeyboardProc = 1
     End If
End If
End Function

这是我到目前为止所做的:

  1. 将 App.hInstance 更改为 0&,因为我收到 App.hInstance 错误。未定义。
 Public Sub hookup()
 Call UnhookWindowsHookEx(m_hDllKbdHook)
 m_hDllKbdHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0&)
 End Sub

 Public Sub hookup()
 Call UnhookWindowsHookEx(m_hDllKbdHook)
 m_hDllKbdHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, 0&, 0&)
 End Sub
  1. 在所有声明旁边添加了 PtrSafe 但随后出现不匹配并突出显示“AddressOf LowLevelKeyboardProc”
 Public Sub hookup()
 Call UnhookWindowsHookEx(m_hDllKbdHook)
 m_hDllKbdHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, 0&, 0&)
 End Sub

所以我将“lpfn As Long”更改为“lpfn As LongPtr”,然后不匹配错误消失了。

Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long

Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As LongPtr, ByVal hmod As Long, ByVal dwThreadId As Long) As Long

但问题是,即使我摆脱了宏编辑器中的所有错误消息,并且我可以毫无问题地运行这个宏,它似乎在幻灯片放映期间什么也没做。 ESC 键即使在显示期间通过宏窗口运行或单击“运行宏”的操作按钮后仍然有效。

在 Office 选项中将宏设置为始终启用(最低安全模式),并且演示文稿保存为 (.ppsm),因此启用宏格式。

这是我修改后的完整代码:


Option Explicit
 
'Esc Disable Key
Private Const WH_KEYBOARD_LL = 13&
Private Const HC_ACTION = 0&
Private Const VK_ESCAPE = &H1B
 
Private Type KBDLLHOOKSTRUCT
  vkCode As Long
  scanCode As Long
  flags As Long
  time As Long
  dwExtraInfo As Long
End Type
   Dim Response As Integer
 
Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As LongPtr, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Public Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Declare PtrSafe Sub CopyMemory Lib "Kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal cb As Long)
Private Declare PtrSafe Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Public m_hDllKbdHook As Long
 
 Public Sub hookup()
 Call UnhookWindowsHookEx(m_hDllKbdHook)
 m_hDllKbdHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, 0&, 0&)
 End Sub
 
Public Function LowLevelKeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Static kbdllhs As KBDLLHOOKSTRUCT
 
If nCode = HC_ACTION Then
      Call CopyMemory(kbdllhs, ByVal lParam, Len(kbdllhs))
     If (kbdllhs.vkCode = VK_ESCAPE) Then
       LowLevelKeyboardProc = 1
     End If
End If
End Function

谢谢你,对不起我的英语不好:)

【问题讨论】:

    标签: vba powerpoint office-2016


    【解决方案1】:

    当人们深入研究 Excel API 函数时,这曾经是一个大问题。幸运的是,这个网站有很多你需要的东西:

    https://jkp-ads.com/Articles/apideclarations.asp

    这正是你所需要的:)

    【讨论】:

    • 谢谢 Peyter,您发送到这里的网站应该很有帮助,但正如我所说,我对编码一无所知,我需要几个月的时间才能理解该网站对我说的内容。我真的把 LongPtr 放在了任何地方,并希望这足以工作:/。不知道我需要在上面的代码中更改什么。
    • 您的请求背后的原因和用例究竟是什么?我只是想知道,如果它这么复杂,也许有更好的方法?我在想象你正在做某种基于网络的培训或其他东西,但使用 PPT?如果我了解您的用例,我可能会建议一种更简化的方法
    • 我正在使用 PPT 来创建交互式应用程序(测验、交互式项目,甚至使用鼠标的游戏/迷你游戏)。 PPT 做这件事既简单又快速,我喜欢这样做的方式,因为它现在只是我的小爱好。我希望这些项目的行为有点像一个真实的应用程序,所以它不是那么明显,它只是一个常规的演示。它不像我是为工作或为其他人而做的。我这样做只是为了在空闲时间“使用基本工具制作复杂的东西”的创造力,有时我需要---->
    • ----> 以某种方式禁用 ESC 键,因此您无法通过单击 ESC 来退出它,您只需要使用鼠标进行/退出或最终使用组合键将其关闭,这就是我唯一的事情需要,因为编码是我的致命弱点,我花了很多时间想通了,但没有成功。我是一名 2d/3d 艺术家,担任室内建筑可视化和产品可视化工作,所以我可以轻松地做任何图形内容,但编码......从来没有时间学习它。我知道我知道,有很多程序可以让你做应用程序/游戏或其他东西,但我在空闲时间选择了 PPT,因为为什么不呢。
    • 是的,我在 Fiverr 上发现了一些有趣的优惠,谢谢 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 2022-11-18
    • 2018-05-01
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多