我正在尝试创建一个能够在多个PowerPoint演示文稿和电影等之间切换的应用程序。该程序的界面在主监视器上运行,powerpoint将在辅助监视器上运行。为了控制powerpoint,我正在使用powerpoint自动化库。
由于有必要继续进行演示,而powerpoint窗口没有焦点,我正在使用"由个人浏览"幻灯片放映设置。为了确保只有幻灯片放映在监视器上可见,我使用user32库中的SetParent函数。这部分程序运行正常。但是我也希望能够为powerpoint窗口设置透明色,这样就可以在演示文稿中将一些文本作为字幕。
要设置透明色,我还使用user32库中的SetLayeredWindowAttributes函数。但似乎powerpoint在处理透明度密钥时遇到问题。在测试我的程序时,我注意到在启用和不启用aero的情况下设置透明度键会更改问题的症状,但在两种模式下都无法正确设置透明度键。以下描述假定启用了aero。
在测试期间,我还观察到当使用Spy ++实用程序时,当我在finpoint工具窗口上方悬停取景器工具时,突然第一张幻灯片显示变得可见且透明且具有正确的透明色。但是,更改幻灯片时,此效果消失,重新使用取景器工具时,即使实际选定的幻灯片不是第一张幻灯片,第一张幻灯片也会变得透明并再次可见。
要解决此问题,我尝试从powerpoint窗口中删除CS_OWNDC
窗口类样式,因为根据文档,该类样式与WS_EX_LAYERED
窗口样式不兼容(我能够删除这个类通过将代码注入到调用SetClassLongPtr函数的powerpoint进程中。然而,当我退出我的应用程序时(当我的应用程序仍在运行时,我没有注意到有或没有CS_OWNDC
窗口类的任何差异),这让我陷入了死亡的蓝屏。
为了确保所有对SetParent
等的调用都不是问题的一部分,我将代码删除到以下内容:
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实例的主窗口上使用此代码时,#34;模式上述所有观察结果保持不变。这意味着在某种程度上,powerpoint中发生了一些非常奇怪的事情,它能够禁用透明度键。有趣的是,当退出由个人浏览的"模式并返回编辑模式,transprancy键突然正常工作。
所以基本上我的问题归结为我可以做些什么来获得一个透明度键,用于在个人浏览的#34;模式。