Chrome风格的C#应用程序?

Chrome风格的C#应用程序?,c#,windows-vista,google-chrome,C#,Windows Vista,Google Chrome,我不是说vista玻璃功能,我已经知道如何实现这一点。我所说的功能是向标题栏添加控件,就像office 2007使用徽标和工具栏一样。我已经成功地使用了DotNetBar控件套件。您需要执行一些Win32互操作来实现这一效果。根据您使用的是Winforms还是WPF,钩住消息处理的方式会有所不同(我不记得Winforms,所以我将给出WPF的所有示例)。但在这两种情况下,您都需要: 截取窗口的创建并修改窗口样式和扩展样式。在WPF中,您需要继承并修改以实现这一点。对于常规样式、WS_EX_WIN

我不是说vista玻璃功能,我已经知道如何实现这一点。我所说的功能是向标题栏添加控件,就像office 2007使用徽标和工具栏一样。

我已经成功地使用了DotNetBar控件套件。

您需要执行一些Win32互操作来实现这一效果。根据您使用的是Winforms还是WPF,钩住消息处理的方式会有所不同(我不记得Winforms,所以我将给出WPF的所有示例)。但在这两种情况下,您都需要:

  • 截取窗口的创建并修改窗口样式和扩展样式。在WPF中,您需要继承并修改以实现这一点。对于常规样式、WS_EX_WINDOWEDGE和WS_EX_APPWINDOW扩展样式,您需要WS_重叠窗口、WS_剪辑和WS_可见

  • 通过HwndSource参数HwndSourceHook添加消息处理程序

  • 在步骤2中通过钩子添加的消息过程中,您需要处理多条消息:

    • -在应用程序激活或未激活时更改标题的绘制
    • -返回到没有非客户端区域的操作系统
    • -一般情况下,您只需在此处使窗矩形失效,WPF将负责实际涂漆)
    • -处理窗口的移动,最小化和最大化
  • 完成上述操作后,WPF将绘制视觉树的客户端区域将覆盖整个窗口区域。您将需要添加“非cliet”视觉效果,以便您的应用程序看起来像用户的常规应用程序

  • 您可能还需要几条消息:

    • 如果您想更改“非客户端”区域的绘制以与操作系统主题保持一致
    • 如果要在启用玻璃时扩展玻璃并获得标准OS NC玻璃绘制,并在未启用玻璃时切换到自定义逻辑
  • 如果您想获得在“非客户端”区域使用的边框、标题、关闭、最小化和最大化按钮的标准Win32资源,您可能需要查看Win32主题API

  • 如果您想将玻璃伸入车窗,可以查看:

    • -获取标准玻璃NC区域
    • -让桌面管理器绘制玻璃和标准NC控件
    • -确定是否启用了玻璃;您只能在启用玻璃时使用上述两个API。如果未启用玻璃,您需要自己绘制NC区域
  • 您可以在上找到所需的所有消息、样式和相应Win32 API的正确C#定义

    您也可以通过使用带有
    WindowStyle=none
    的标准WPF窗口来实现类似效果。但是,桌面对您的应用程序和其他应用程序的行为之间会有一些差异;最明显的是,您无法通过右键单击任务栏来堆叠或平铺窗口


    您还可以查看一些支持某些功能的第三方组件。我没有使用过任何组件(如您所见,我并不害怕Win32 interop:-),因此我不推荐您使用任何特定组件。

    正如Franci提到的,您需要的是DwmExtendFrameIntoClientArea。下面是Codeproject中的一个示例,演示了如何执行此操作


    WPF产品团队开发人员乔·卡斯特罗(Joe Castro)有一个名为“WPF Chrome”的MSDN代码库项目,可用于创建类似office 2007的UI(即:跨窗口的客户端和非客户端区域的控件)


    在这里找到它:

    不是真的。我本来打算写一个,但我一直没能做到,因为家里有一个5个月大的婴儿等等…:-)注意,当玻璃关闭时,例如在TS下或当用户切换到Vista basic时,DwmExtendFrameIntoClientAre将无法工作。