【问题标题】:Windows Form Appbar Desktop ResizingWindows 窗体 Appbar 桌面大小调整
【发布时间】:2012-12-12 16:17:14
【问题描述】:

好的。就在您认为自己已经完全弄清楚的时候,您还没有。

我已经编写并测试了一个功能性的 appbar 类。当我使用一个简单的 Windows 窗体来扩展和测试该类时,它在 XP(SP 3、32 位)和 Windows 7(64 位)中都可以正常工作。其他窗口是可访问的,并且它们都适当地最大化。然而,当我使用我的“复杂”Windows 窗体(即它是一个应用程序)并从 appbar 类派生它时,桌面似乎将它“踢”了出来。我的意思是,一切最初的大小都合适,但随后桌面将自身调整回原来的大小。有时这在将表单置于 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

【问题讨论】:

  • 参考上面的四条消息,我将其缩小到最后两条。在简单的形式中,这些仅在应用栏未停靠时触发。大约四个小时前能找到这些就好了,哈哈。
  • 这变得更加混乱了。仅供参考,这是层次结构:Form -> AppBar -> Application。这在工作和非工作版本中都是相同的。我注意到在工作版本中,WININICHANGE 从不显示,因为 appbarHandle 变量等于调用的 hWnd 参数。但是,在非功能版本中,情况并非如此。在这里,应用程序句柄是正在发送的内容。唉,我通过将 appbarHandle 变量设置为受保护的内部(相对于私有)并在 Application 构造函数中分配它来纠正这个问题,但问题仍然存在。嗯。仍在搜索...
  • 在旁注中,如果您要将此标记下来,请告诉我原因。我在这里相当新,所以这些信息将是建设性的。谢谢。
  • 这是我发现的。 Application 最初派生自 Form(因为 AppBar 类仍在编写中)。更改基类后,Application.Designer.cs 中的某些内容显然不喜欢这种更改。我创建了一个新的“应用程序”来测试这个理论,它可以正常工作。不确定是什么导致派生类和基类具有单独的句柄,但这似乎已经解决了。

标签: c# winforms winapi


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-30
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多