MouseKeyHook'CallbackOnCollectedDelegate'问题

时间:2019-04-23 20:58:29

标签: c# exception garbage-collection delegates mousekeyhook

我正在使用Gma.System.MouseKeyHook并收到以下异常:

Managed Debugging Assistant 'CallbackOnCollectedDelegate' Message=Managed Debugging Assistant 'CallbackOnCollectedDelegate' : 'A callback was made on a garbage collected delegate of type 'Gma.System.MouseKeyHook!Gma.System.MouseKeyHook.WinApi.HookProcedure::Invoke'. This may cause application crashes, corruption and data loss. When passing delegates to unmanaged code, they must be kept alive by the managed application until it is guaranteed that they will never be called.'

我尝试处理函数调用和订阅。但是,问题仍然存在。我也尝试多次运行它,偶尔它也会给出一个'NullReferenceException'。这也让我很困惑,也许那些问题是相关的。

using Gma.System.MouseKeyHook;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;



// Uses a MouseKeyHook Library license at 
https://github.com/gmamaladze/globalmousekeyhook/blob/master/LICENSE.txt

namespace TransparentClickTest {
public partial class Form1 : Form {


    public Form1() {
        //GC.TryStartNoGCRegion(100);
        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        BackColor = Color.Red;
        TransparencyKey = Color.Red;
        InitializeComponent();

        OnDown();            

    }
    protected virtual void OnUp() {
        Hook.GlobalEvents().MouseUp += (sender, e) => {
            try {
                label1.Text = "Mouse Up!!!";
                Hook.GlobalEvents().Dispose();
                OnDown();
            }
            catch(Exception e2) {
                Hook.GlobalEvents().Dispose();
                OnDown();                   
            }
        };
    }

    protected virtual void OnDown() {
        Hook.GlobalEvents().MouseDown += (sender, e) => {
            try {
                label1.Text = $"Mouse {e.Button} Down at {e.X}, {e.Y}";
                Opacity = 1;
                Hook.GlobalEvents().Dispose();
                OnUp();
            }
            catch(Exception e1) {
                Hook.GlobalEvents().Dispose();
                OnUp();
            }
        };
    }

    private void PictureBox1_Click(object sender, EventArgs e) {

    }

    private void Label1_Click(object sender, EventArgs e) {

    }


}

}

1 个答案:

答案 0 :(得分:1)

  1. 添加此内容: 私有静态IKeyboardMouseEvents HookEvents = null;
  2. 使用 HookEvents.MouseDown 替换 Hook.GlobalEvents()。MouseDown