#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, работающем в режиме «просмотр пользователем».