2014-09-14 3 views
4

Я создаю экземпляр OLE из PowerPoint и отправлять команды на него:PowerPoint 2013 теряет фокус после команды Экспорт OLE VBA

 
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; 

Этот код работает очень хорошо со всеми PowerPoint версий (2000, 2002, 2003, 2007, 2010).

Однако PowerPoint 2013 иногда теряет фокус. Мы не можем менять слайды с клавиатуры. Чтобы восстановить фокус, мы должны щелкнуть ползунок на весь экран.

Комментарии: Это официальная ошибка в PowerPoint 2013?
Ответы: любое исправление или обход?

+0

Это сообщение в справочном форуме для Apple, указывает на то, что была проблема введена обновление для PowerPoint, который вызвал ряд проблем людей с потерей фокуса клавиатуры. Они обнаружили, что, возвращаясь к предыдущей версии, они не видели проблемы. Похоже, что обновление было исправлено, так как это исправило проблему. См. Http://answers.microsoft.com/en-us/mac/forum/macoffice2011-macpowerpoint/keyboard-becomes-unresponsive-during-powerpoint/6719901b-18b1-48d8-b585-9d9a33956263 –

+0

Еще один вопрос: есть ли другие приложения, которые будут захватывать фокус ввода. У вас есть какой-то инструмент, чтобы узнать, какое приложение имеет фокус ввода, который вы можете использовать для мониторинга того, что происходит? Мне любопытно, как вы проводите тестирование, чтобы убедиться, что он отлично работает для других версий PowerPoint. Вы устанавливаете более ранние версии на одном компьютере или что? –

+0

Приложение Process Explorer может помочь с пониманием того, что делает фокус. Http: //en.wikipedia.org/wiki/Process_Explorer –

ответ

3

В качестве временного решения, попробуйте играть с Activate на Application и SlideShowWindow:

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 как я описал here.

Обновлено на основе комментария, метод Activate не решает проблему, но AttachThreadInput/SetForegroundWindow один, по-видимому делает. Код от linked answer переопределяет политику Windows по предотвращению манипуляций с фокусом из процесса, который в настоящее время не имеет самого фокуса. Это достигается объединением цепочек ввода потоков вызывающего процесса (того, который выполняет автоматизацию), автоматизируемого процесса (PowerPoint) и процесса, который в настоящее время имеет фокус (который может отличаться от двух других).

+0

Noseratio, можете ли вы объяснить AttachThreadInput/SetForegroundWindow в отдельном ответе * СЕГОДНЯ * для вашей щедрости? Хотя метод Activate() не дает фокуса PowerPoint, когда в фоновом режиме, второй метод приносит PowerPoint на передний план и очень перспективен для решения проблемы потери управления клавиатурой. Спасибо! – rjobidon

+1

@rjobidon, рад, что это помогло. Я думаю, было бы более целесообразно обновить этот ответ (что я только что сделал), сообщите мне, нужно ли уточнить какие-либо подробности. – Noseratio

0

Я haved тот же problème и я решил с SetFocus API:

Public Declare Function SetFocus Lib "user32.dll" (ByVal HWND As Long) As Long

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

дим intSlideShowHWnd As Long

дим результат до тех пор,

intSlideShowHWnd = FindWindow ("screenClass", 0 &)

результат = SetFocus (intSlideShowHWnd)

Смежные вопросы