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

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

程序ExportSlide(const SlideIndex:Integer);
 VAR
   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中的官方错误吗?
答案:任何修补程序或解决方法?

作为一种解决方法,尝试使用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的焦点,如我在这里所述。

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

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

Public Declare Function SetFocus Lib“user32.dll”(ByVal hwnd As Long)As Long

Wn.View.Slide.Export filePath,“JPG”

Dim intSlideShowHWnd As Long

昏暗的结果一样长

intSlideShowHWnd = FindWindow(“screenClass”,0&)

结果= SetFocus(intSlideShowHWnd)