5

我创建了一个 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 中的官方错误吗?
回答: 有什么修复或解决方法吗?

4

2 回答 2

4

作为一种解决方法,请尝试使用ActivateonApplicationSlideShowWindow

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.HWNDor ppt.ActivePresentation.SlideShowWindow.HWND(这是原始 Windows 句柄)并通过AttachThreadInput/强制将焦点集中在它上面,SetForegroundWindow正如我在此处描述的那样。

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

于 2014-09-18T14:05:06.383 回答
0

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

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

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

暗淡 intSlideShowHWnd 只要

暗淡的结果只要

intSlideShowHWnd = FindWindow("screenClass", 0&)

结果 = SetFocus(intSlideShowHWnd)

于 2014-11-14T10:44:10.440 回答