如何避免Windows窗体/ SlimDX中重叠窗口之间的竞争

时间:2014-08-11 17:53:43

标签: c# winforms focus slimdx direct3d9

我正在使用SlimDX(Direct3D API的托管包装)库在C#中创建Windows窗体应用程序。当我尝试将应用程序全屏显示时(主窗口覆盖整个桌面区域,包括任务栏),会出现问题。

Direct3D设备窗口(主窗口)正确显示。任务栏和其他重叠窗口完全由设备窗口隐藏。但是,光标似乎属于设备窗口正下方的窗口。这在光标的外观和行为中很明显。当我点击设备窗口时,焦点会变为下面的窗口。这是任何窗口的意外行为。

此外,我可以点击任务栏上的项目,这会导致焦点发生变化。

我正在将设备窗口的窗口样式更改为“TopMost和'Popup'。另外,我正在关注DirectX SDK中的实用程序类。当我从使用Win32的DX SDK运行示例时,不会发生此问题。该问题可能与我使用Windows窗体有关吗?

我的应用程序中涉及了很多代码,因此我希望能够就可能发生此问题的原因进行理论响应。我找到了一个线程here来描述设备全屏时的问题,但是,解决方案是不可接受的。建议使用“窗口全屏模式”。不是修改全屏的适配器显示模式,而是简单地调整设备窗口以覆盖整个屏幕。此解决方案将阻止使用全屏模式下可用的适配器格式,分辨率和刷新率。

任何建议都会非常感谢!

1 个答案:

答案 0 :(得分:1)

问题是由于Windows窗体中的控件的性质。 From MSDN

如果满足以下所有条件,则可以选择控件并接收输入焦点:ControlStyles的可选值设置为true,它包含在另一个控件中,并且其所有父控件都可见并启用。

我的应用程序中的设备窗口属于父窗口,启用全屏后父窗口将变为不可见。由于上面的“焦点规则”,可能会发生冲突。为了测试这个理论,我检查了DeviceWindow.Focus()的返回值(派生自Control.Focus())...返回false。

我的解决方案是创建一个仅用于全屏模式更改的表单。现在,当我想要全屏时,我将设备重置为新设备窗口的句柄。所有问题都解决了......