8

我有这个代码片段:

internal class MTool : NativeWindow
{
    private const int WM_LBUTTONDOWN = 0x0201;
    public event TipDeactivateEventHandler Deactivate;

    protected override void WndProc(ref System.Windows.Forms.Message m)
    {           
        if( m.Msg == WM_LBUTTONDOWN )
        {
            if( this.Deactivate != null)
            {
                this.Deactivate();
            }
        }

        base.WndProc(ref m);
    }
}

当我运行我的程序时,我在该行收到一个 AccessViolationException 错误,base.WndProc(ref m);我不知道为什么。

显然,这是从 .NET 2.0 移植到 4.0 的,我的理论是现在可能有一种替代方法可以用来代替覆盖 WndProc。是这种情况吗?如果不是,为什么我会收到此异常?

4

3 回答 3

7

我通过在方法上方添加此属性来修复它:

[System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions]

然后用 try/catch 包围发生异常的行。我在这里找到了这些信息。

于 2012-08-20T19:39:17.207 回答
2

WndProc要求完全信任的节目的文档。你试过吗?例如:

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
internal class MTool : NativeWindow
{
    [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
    protected override void WndProc(ref Message m)
    {
//...
于 2012-08-20T17:25:03.833 回答
0

我怀疑您的代码中发生了更大的事情。根据您的代码段,我会尝试:

  1. 注释掉 WndProc 覆盖,这是否仍然通过在其他地方崩溃来重现?
  2. 使 WndProc 仅调用“base.WndProc(ref msg)”。你仍然得到同样的错误吗?调用堆栈是什么?堆栈中是否还有更多代码?
  3. 按原样使用代码段,这仅在 WM_LBUTTONDOWN 时发生吗?当这引发该异常时,该 Deactivate 处理程序挂钩的是什么?

如果这些尝试不实用,您可能需要更新代码段以更好地解释您正在尝试做什么。

于 2012-08-20T18:04:29.027 回答