Windows 导出OLE VBA命令后PowerPoint 2013失去焦点
我创建PowerPoint的OLE实例并向其发送命令: procedure ExportSlide(const SlideIndex : Integer); var ppt : Variant; begin ppt := GetActiveOleObject('Powerpoint.Application'); ppt.ActivePresentation.Slides.Item(SlideIndex).Export('c:\test.png', 'PNG', 640, 480); ppt := Unassigned; end; 过程导出幻灯片(常量幻灯片索引:整数); 变量 ppt:变体; 开始 ppt:=GetActiveOleObject('Powerpoint.Application'); 导出('c:\test.png','png',640480); ppt:=未分配; 结束; 此代码适用于所有PowerPoint版本(2000、2002、2003、2007、2010) 然而,PowerPoint 2013有时会失去焦点。我们不能再使用键盘更改幻灯片。我们必须点击全屏幻灯片来恢复焦点 评论:这是PowerPoint 2013中的官方错误吗?Windows 导出OLE VBA命令后PowerPoint 2013失去焦点,windows,vba,com,ole,powerpoint-2013,Windows,Vba,Com,Ole,Powerpoint 2013,我创建PowerPoint的OLE实例并向其发送命令: procedure ExportSlide(const SlideIndex : Integer); var ppt : Variant; begin ppt := GetActiveOleObject('Powerpoint.Application'); ppt.ActivePresentation.Slides.Item(SlideIndex).Export('c:\test.png', 'PNG', 640, 480)
回答:有任何修复或解决方法吗?作为一种解决方法,请尝试在
应用程序上玩激活和幻灯片窗口
:
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
(这是原始窗口句柄)并通过AttachThreadInput
/setforegroundindow
将焦点强制到它
更新了根据注释,Activate
方法不能解决问题,但是AttachThreadInput
/setforegroundindow
方法显然能解决问题。来自的代码重写了Windows策略,该策略防止当前没有焦点的进程进行焦点操作。这是通过将调用进程(执行自动化的进程)、正在自动化的进程(PowerPoint)和当前具有焦点的进程(可能不同于其他两个)的线程输入队列连接在一起实现的 我遇到了同样的问题,我用SetFocus api解决了这个问题:
公共声明函数SetFocus Lib“user32.dll”(ByVal hwnd As Long)为Long
Wn.View.Slide.Export文件路径,“JPG”
暗显intSlideShowHWnd尽可能长
结果很长
intSlideShowHWnd=FindWindow(“屏幕类”,0&)
result=SetFocus(intSlideShowHWnd)苹果帮助论坛上的这篇帖子表明,PowerPoint更新引发了一个问题,该问题导致许多人失去键盘焦点。他们发现,回到以前的版本,他们没有看到问题。似乎有一个更新,因为它纠正了问题。另一个问题是,是否有其他运行的应用程序会抓住输入焦点。您是否有某种工具来查看哪个应用程序具有输入焦点,您可以使用它来监视正在发生的事情?我很好奇您如何进行测试,以验证它是否适用于其他版本的PowerPoint。您是在同一台计算机上安装早期版本还是什么?application Process Explorer可能有助于了解重点是什么。嗨,Richard,问题在于Windows上的PowerPoint 2013,而不是Mac上的PowerPoint 2013。使用Process Explorer是个好主意!问题是我不能总是重现这个问题。。。在我的系统上它是间歇性的,而在其他计算机上它更频繁。Noseratio,你能在今天的一个单独的答案中为你的赏金解释AttachThreadInput/SetForegroundWindow吗?当Activate()方法在后台时不会将焦点放在PowerPoint上,而第二种方法将PowerPoint放在前端,很有可能解决键盘控制丢失的问题。谢谢大家!@rjobidon,很高兴这有帮助。我认为更新这个答案(我刚才所做的)更合适,如果我需要澄清任何进一步的细节,请告诉我。