如何避免windows Forms/SlimDX中重叠窗口之间的竞争?
本文关键字:之间 窗口 竞争 重叠 windows 何避免 Forms SlimDX | 更新日期: 2023-09-27 18:17:42
我正在用c#创建一个Windows窗体应用程序,它利用了SlimDX(Direct3D API的托管包装器)库。当我尝试采用应用程序全屏时(主窗口覆盖整个桌面区域,包括任务栏的状态),问题就出现了。
Direct3D设备窗口(主窗口)显示正常。任务栏和其他重叠的窗口完全隐藏在设备窗口中。然而,光标似乎属于设备窗口正下方的窗口。这在光标的外观和行为中是显而易见的。当我点击设备窗口时,焦点会切换到下面的窗口。这是任何窗口的意外行为。
另外,我可以点击任务栏上的项目,这将导致焦点的变化。
我正在将设备窗口的窗口样式更改为'TopMost和'Popup'。此外,我正在遵循DirectX SDK中发现的实用程序类。当我从使用Win32的DX SDK运行示例时,不会发生此问题。这个问题是否可能与我使用Windows窗体有关?
我的应用程序中涉及到很多代码,所以我希望能从理论上回答为什么会出现这个问题。我在这里发现了一个线程,描述了设备全屏时的问题,然而,解决方案是不可接受的。建议使用"窗口全屏模式"。设备窗口将简单地调整大小以覆盖整个屏幕,而不是修改适配器的全屏显示模式。此解决方案将防止使用全屏模式下可用的适配器格式、分辨率和刷新率。
任何建议都将非常感谢!
这个问题是由于Windows窗体中控件的性质造成的。从MSDN:
如果满足以下所有条件,控件可以被选中并接收输入焦点:ControlStyles的Selectable值被设置为true,它包含在另一个控件中,并且它的所有父控件都是可见的并且是启用的。
我的应用程序中的设备窗口属于父窗口,一旦全屏启用,父窗口变得不可见。有可能因为上面的"焦点规则"而产生冲突。为了测试这个理论,我检查了DeviceWindow.Focus()(派生自Control.Focus())的返回值…返回false
我的解决方案是创建一个用于全屏模式更改的唯一目的的表单。现在,当我想全屏时,我用手柄重置设备到新的设备窗口。