好的。就在您认为自己已经弄明白的时候,您还没有。
我编写并测试了一个功能性应用栏类。当我使用一个简单的 Windows 窗体来扩展和测试该类时,它在 XP(SP 3、32 位)和 Windows 7(64 位)中都没有问题。其他窗口是可访问的,并且它们都适本地最大化。然而,当我使用我的“复杂”Windows 窗体(即它是一个应用程序)并从 appbar 类派生它时,桌面似乎将它“踢”了出去。我的意思是,最初所有内容的大小都合适,但随后桌面会自行调整大小,恢复到原来的大小。有时,在将表单置于应用栏模式后,这种情况会很快发生,有时会在我单击表单外部(例如打开浏览器)时发生,有时会在表单调用 MessageBox 时发生。我已将所有表单功能放在后台工作人员中,认为这可能是问题所在,但结果是一样的。我在下面贴了三张图片。第一个将应用程序显示为其初始 WinForm。第二个显示应用栏“正在运行”。最后一个显示应用栏没有“运行”。如果您在查看问题时遇到问题,请注意回收站。有什么想法吗?
编辑: 我通过日志记录找到了这些电话。每次桌面调整为“正常”时,它们似乎都会启动。现在,我正在尝试查看“简单”版本中是否存在类似模式。
- msg=0x6 (WM_ACTIVATE) hwnd=0x1e03ea wparam=0x0 lparam=0x0 结果=0x0
- msg=0x1c (WM_ACTIVATEAPP) hwnd=0x1e03ea wparam=0x0 lparam=0x1a90 结果=0x0
- msg=0x1a (WM_WININICHANGE) hwnd=0x1e03ea wparam=0x2f lparam=0x9fe048 结果=0x0
- msg=0x1a (WM_WININICHANGE) hwnd=0x1e03ea wparam=0x18 lparam=0x9fe038 结果=0x0
最佳答案
所以这是一场徒劳的追逐。如果我最后的评论听起来很荒谬,那确实是。虽然我仍然不能 100% 确定这个理论(请有人在闲暇时证明/反驳),但两个不同的句柄来自 (1) 窗体的实例化和 (2) 加载窗体时的实际句柄。我假设 API 遵循与 QUERY_POS 和 SET_POS 相同的概念,即它最初检查并分配一个有效句柄。然后,在显示表单之前,它会仔细检查句柄值。
长话短说,在 Load 事件中验证句柄值的一行代码解决了整个问题。
编辑: 更好的是,HandleCreated 事件是不可替代的。
关于c# - Windows 窗体 Appbar 桌面调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13843988/