【问题标题】:PowerPoint 2013 loses focus after Export OLE VBA command导出 OLE VBA 命令后 PowerPoint 2013 失去焦点
【发布时间】:2014-11-08 07:51:48
【问题描述】:

我创建了一个 PowerPoint 的 OLE 实例并向其发送命令:

过程 ExportSlide(const SlideIndex : Integer); 变量 ppt:变体; 开始 ppt := GetActiveOleObject('Powerpoint.Application'); ppt.ActivePresentation.Slides.Item(SlideIndex).Export('c:\test.png', 'PNG', 640, 480); ppt := 未分配; 结尾;

此代码适用于所有 PowerPoint 版本(2000、2002、2003、2007、2010)。

但是 PowerPoint 2013 有时会失去焦点。我们不能再使用键盘更改幻灯片。我们必须点击全屏幻灯片才能恢复焦点。

评论:这是 PowerPoint 2013 中的官方错误吗?
答案:任何修复或解决方法?

【问题讨论】:

  • 这篇在 Apple 帮助论坛上的帖子表明,PowerPoint 更新引入了一个问题,导致许多人出现键盘焦点丢失问题。他们发现回到以前的版本没有发现问题。自从纠正了问题以来,似乎已经进行了更新。见answers.microsoft.com/en-us/mac/forum/…
  • 另一个问题是是否有其他正在运行的应用程序会获取输入焦点。您是否有某种工具可以查看哪个应用程序具有可用于监控正在发生的事情的输入焦点?我很好奇您如何进行测试以验证它是否适用于其他版本的 PowerPoint。您是在同一台计算机上安装早期版本还是什么?
  • 应用程序 Process Explorer 可能有助于了解什么是焦点。 en.wikipedia.org/wiki/Process_Explorer
  • 嗨,Richard,问题出在 Windows 上的 PowerPoint 2013 上,而不是 Mac 上。使用 Process Explorer 的好主意!问题是我不能总是重现这个问题......在我的系统上它是间歇性的,而在其他计算机上它更频繁。

标签: windows vba com ole powerpoint-2013


【解决方案1】:

作为一种解决方法,尝试在ApplicationSlideShowWindow 上使用Activate

procedure ExportSlide(const SlideIndex : Integer);
var
  ppt : Variant;
begin
  ppt = GetActiveOleObject('Powerpoint.Application');  

  ppt.Activate();

  ppt.ActivePresentation.Slides.Item(SlideIndex).Export('c:\test.png', 'PNG', 640, 480);

  ppt.ActivePresentation.SlideShowWindow.Activate();

  ppt := Unassigned;
end;

如果这没有帮助,您应该可以使用 ppt.HWNDppt.ActivePresentation.SlideShowWindow.HWND(这是原始 Windows 句柄)并通过 AttachThreadInput/SetForegroundWindow 将焦点强制到它上面,正如我所描述的 @987654321 @。

更新根据评论,Activate 方法不能解决问题,但 AttachThreadInput/SetForegroundWindow 显然可以。 linked answer 中的代码覆盖了 Windows 策略,即阻止当前没有焦点的进程进行焦点操作。这是通过将调用进程(执行自动化的进程)、正在自动化的进程(PowerPoint)和当前具有焦点的进程(可能与其他两个不同)的线程输入队列连接在一起来实现的。

【讨论】:

  • Noseratio,您能否在单独的答案 TODAY 中为您的赏金解释 AttachThreadInput/SetForegroundWindow 吗?虽然 Activate() 方法在后台时不会将焦点放在 PowerPoint 上,但第二种方法将 PowerPoint 放在前面,非常有希望解决键盘控制丢失的问题。谢谢!
  • @rjobidon,很高兴它有帮助。我认为更新这个答案(我刚刚做的)更合适,如果我需要澄清任何进一步的细节,请告诉我。
【解决方案2】:

我遇到了同样的问题,我用 SetFocus api 解决了:

公开声明函数 SetFocus Lib "user32.dll" (ByVal hwnd As Long) As Long

Wn.View.Slide.Export filePath, "JPG"

将 intSlideShowHWnd 变暗

结果变暗

intSlideShowHWnd = FindWindow("screenClass", 0&)

结果 = SetFocus(intSlideShowHWnd)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多