Windows窗体Appbar桌面调整大小

时间:2012-12-12 16:17:15

标签: c# winforms winapi

好。就在你认为自己已经完全理解的时候,你还没有。

我编写并测试了一个功能性appbar类。当我使用简单的Windows窗体来扩展和测试类时,它在XP(SP 3,32位)和Windows 7(64位)中都没有问题。其他窗户可以访问,它们都适当地最大化。但是,当我使用我的“复杂”Windows窗体(即它是一个应用程序)并从appbar类派生它时,桌面似乎“踢出”它。我的意思是说最初所有尺寸都适当,但桌面会自行恢复原来的尺寸。有时在将表单放入appbar模式后会很快发生这种情况,有时候当我单击表单外部(例如打开浏览器)时会发生这种情况,有时候当表单调用MessageBox时会发生这种情况。我已将所有Forms函数放在后台工作者中,这可能是问题所在,但结果是一样的。我在下面发布了三张图片。第一个将应用程序显示为其最初的WinForm。第二个显示appbar“正常运行”。最后一个显示appbar没有“正常运行”。如果您在查看问题时遇到问题,请注意回收站。有什么想法吗?

enter image description here enter image description here enter image description here

编辑: 我通过记录找到了这些电话。每次桌面调整为“正常”时,它们似乎都会启动。现在我试图看看“简单”版本中是否存在类似的模式。

  • msg = 0x6(WM_ACTIVATE)hwnd = 0x1e03ea wparam = 0x0 lparam = 0x0 result = 0x0
  • msg = 0x1c(WM_ACTIVATEAPP)hwnd = 0x1e03ea wparam = 0x0 lparam = 0x1a90 result = 0x0
  • msg = 0x1a(WM_WININICHANGE)hwnd = 0x1e03ea wparam = 0x2f lparam = 0x9fe048 result = 0x0
  • msg = 0x1a(WM_WININICHANGE)hwnd = 0x1e03ea wparam = 0x18 lparam = 0x9fe038 result = 0x0

1 个答案:

答案 0 :(得分:1)

所以这是一场疯狂的追逐。如果我的上一次评论听起来很荒谬,那就是。虽然我仍然不能100%肯定这个理论(有人请你在闲暇时证明/反驳),但两个不同的句柄来自(1)表格的实例化和(2)表格加载时的实际句柄。我假设API遵循QUERY_POS和SET_POS的相同概念,即它最初检查并分配有效句柄。然后,在显示表单之前,它会双重检查句柄值。

长话短说,在Load事件中验证句柄值的一行代码解决了整个问题。

编辑: 更好的是,HandleCreated事件是不可替代的。