gpt4 book ai didi

c# - Windows Aero 窗体错误

转载 作者:可可西里 更新时间:2023-11-01 14:07:25 26 4
gpt4 key购买 nike

好的,所以我已经按照文档一直到最小的细节,当我尝试调试和运行 (F5) 时,它一直给我以下错误:

PInvokeStackImbalance was detected Message: A call to PInvoke function 'VistaControls!VistaControls.Dwm.NativeMethods::DwmExtendFrameIntoClientArea' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

我不知道这是什么意思,也不知道如何解决!有人可以帮忙吗?有什么建议吗?

我以前用过这个,但这次没用。我正在使用 VS2010 Express C# WinForms、.NET 4(就像我很久以前第一次使用它时一样。)

谢谢

链接:http://windowsformsaero.codeplex.com/wikipage?title=Glass%20on%20WinForms&referringTitle=Documentation

是的,我注意到有人在那个页面的底部做了更正,我修复了它,但它仍然不起作用!

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using VistaControls.Dwm;

namespace One_Stop_Management
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);

e.Graphics.FillRectangles(Brushes.Black, new Rectangle[] {
new Rectangle(0, 0, this.ClientSize.Width, 30),
new Rectangle(this.ClientSize.Width - 30, 0, 30, this.ClientSize.Height),
new Rectangle(0, this.ClientSize.Height - 30, this.ClientSize.Width, 30),
new Rectangle(0, 0, 30, this.ClientSize.Height)
});
}

protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);

VistaControls.Dwm.DwmManager.EnableGlassSheet(this);
}
}
}

最佳答案

通过恢复到 .NET 3.5,您只是隐藏了问题:堆栈不平衡仍然存在,您只是没有从负责检测正确的 P/Invoke 调用的托管调试助手那里得到任何异常,原因不明对我来说。

“Windows 窗体 Aero”库中 DwmExtendFrameIntoClientArea 的签名错误。

这是原始的非托管签名:

HRESULT WINAPI DwmExtendFrameIntoClientArea(HWND hWnd, __in  const MARGINS *pMarInset);

这是库中的签名:

[DllImport("dwmapi.dll", PreserveSig = false)]
public static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref Margins pMarInset);

虽然乍一看它似乎与非托管的相匹配,但事实并非如此。 PreserveSig = false 告诉 CLR 解释返回的 HRESULT 并在它对应于错误时自动抛出异常(参见 PreserveSig on MSDN )。函数返回类型必须是 void 而不是 int,因为运行时已经从堆栈中消耗了结果。

在库代码中更改为PreserveSig = true,堆栈不平衡将消失。

关于c# - Windows Aero 窗体错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5050526/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com