我创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中的官方错误吗?
答案:任何修补程序或解决方法?
作为一种解决方法,尝试使用Application
和SlideShowWindow
进行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.HWND
或ppt.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)