Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 导出OLE VBA命令后PowerPoint 2013失去焦点_Windows_Vba_Com_Ole_Powerpoint 2013 - Fatal编程技术网

Windows 导出OLE VBA命令后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)

我创建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中的官方错误吗?

回答:有任何修复或解决方法吗?

作为一种解决方法,请尝试在
应用程序上玩
激活
幻灯片窗口

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,很高兴这有帮助。我认为更新这个答案(我刚才所做的)更合适,如果我需要澄清任何进一步的细节,请告诉我。