Как установить клавишу прозрачности в окне PowerPoint?

#c# #powerpoint #user32

#c# #powerpoint #пользователь32

Вопрос:

Я пытаюсь создать приложение, которое может переключаться между несколькими презентациями PowerPoint, а также фильмами и т. Д. Интерфейс этой программы запущен на основном мониторе, а powerpoint будет на дополнительном мониторе. Для управления PowerPoint я использую библиотеку автоматизации PowerPoint.

Поскольку необходимо, чтобы презентации продолжались, пока окно PowerPoint не сфокусировано, я использую параметр слайд-шоу «Просмотр отдельным пользователем». Чтобы убедиться, что на мониторе видно только слайд-шоу, я использую функцию SetParent из библиотеки user32. Эта часть программы работает нормально. Однако я также хочу иметь возможность устанавливать прозрачный цвет для окна PowerPoint, это позволяет, например, использовать некоторый текст в презентации в качестве субтитров.

Для установки прозрачного цвета я использую функцию SetLayeredWindowAttributes также из библиотеки user32. Но, похоже, у PowerPoint проблемы с обработкой ключа прозрачности. При тестировании моей программы я заметил, что установка клавиши прозрачности с включенной функцией aero и без нее изменяет симптомы проблемы, но в обоих режимах невозможно правильно установить клавишу прозрачности. В приведенном ниже описании предполагается, что aero включен.

Во время тестирования я также заметил, что при использовании утилиты Spy при наведении курсора finder на окно PowerPoint первый слайд презентации внезапно становится видимым и прозрачным с правильным прозрачным цветом. Однако при смене слайда этот эффект исчезает, и при повторном использовании инструмента Finder первый слайд снова становится прозрачным и видимым, даже если фактически выбранный слайд не является первым слайдом.

Чтобы решить эту проблему, я попытался удалить CS_OWNDC стиль класса window из окна powerpoint, поскольку этот стиль класса несовместим со WS_EX_LAYERED стилем window в соответствии с документацией (я смог удалить этот класс, введя код в процесс powerpoint, который вызывает функцию SetClassLongPtr). Однако из-за этого я застрял с синим экраном смерти при выходе из моего приложения (когда мое приложение все еще работало, я не заметил никакой разницы с CS_OWNDC классом window или без него).

Чтобы убедиться, что все вызовы SetParent etc. не являются частью проблемы, я сократил свой код до следующего:

 private static void SetWindowTransparencyKey(IntPtr HWND, COLORREF TransparentColor)
{
   // Add WS_EX_LAYERED to the window style
   uint OldWindowStyle = (uint)GetWindowLongPtr(HWND, (int)GWL.GWL_EXSTYLE);
   uint NewWindowStyle = OldWindowStyle | (uint)WindowStyles.WS_EX_LAYERED;
   SetWindowLongPtr(HWND, (int)GWL.GWL_EXSTYLE, (IntPtr)NewWindowStyle);

   // Set the transparent color
   SetLayeredWindowAttributes(HWND, TransparentColor.ColorDWORD, 255, LWA_COLORKEY);
}
  

Когда я использую этот код непосредственно в главном окне открытого вручную экземпляра PowerPoint, работающего в режиме «просмотр пользователем», все приведенные выше наблюдения остаются неизменными. Это означает, что каким-то образом в PowerPoint происходит что-то очень странное, которое может отключить ключ прозрачности. Интересно то, что при выходе из режима «просмотрено пользователем» и возвращении в режим редактирования клавиша прозрачности внезапно начинает работать.

Итак, в основном мой вопрос сводится к тому, что я могу сделать, чтобы заставить ключ прозрачности работать в окне PowerPoint, работающем в режиме «просмотр пользователем».