PowerPoint 2013 在导出 OLE VBA 命令后失去焦点

rjo*_*don 5 windows com vba ole powerpoint-2013

我创建 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 中的官方错误吗?
答案:任何修复或解决方法?

nos*_*tio 4

作为解决方法,请尝试使用ActivateonApplication和SlideShowWindow:

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;
Run Code Online (Sandbox Code Playgroud)

如果这没有帮助,您应该能够采用ppt.HWNDor (这是原始 Windows 句柄)并通过/ppt.ActivePresentation.SlideShowWindow.HWND强制将焦点移至它,如我在此处所述。AttachThreadInputSetForegroundWindow

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