1

有人可以看看我有崩溃问题的 C# 源代码吗?该程序应该省略鼠标有时发送的不必要的双击,它可以工作,但在使用该程序一段时间后它会崩溃。

崩溃的行:

Application.Run(new TheContext());

这是错误代码:

An unhandled exception of type 'System.NullReferenceException' occurred in Gma.System.MouseKeyHook.dll

我正在使用 Visual Studio 社区 2017

资源:

程序.cs: https ://pastebin.com/AX9VRi00

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace MouseFixer
{
    static class Program
    {

        static Mutex pmu;

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {

            // Console.WriteLine("Hello");

            try
            {
                Mutex.OpenExisting("MouseFixer");

                MessageBox.Show("MouseFixer is already running", "", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                return;
            }
            catch
            {
                pmu = new Mutex(true, "MouseFixer");
            }

            Application.Run(new TheContext());

        }


    }
}

thecontext.cs: https ://pastebin.com/G1cNzj4d

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using Gma.System.MouseKeyHook;

using System.Diagnostics;


namespace MouseFixer
{
    public class TheContext : ApplicationContext
    {

        // https://stackoverflow.com/questions/30061813/intercept-mouse-click

        StringBuilder logText;

        long lastClickTime;
        long lastMouseUp;
        bool ignoreClick = false;

        void writeLog(string msg)
        {
            logText.Append(msg + Environment.NewLine);
            File.AppendAllText("log.txt", logText.ToString());
            logText.Clear();
        }

        bool errorShown = false;
        void errorMsg(string str)
        {
            if(!errorShown)
            MessageBox.Show(str);

            errorShown = true;
        }

        long getTime()
        {
           return DateTimeOffset.Now.ToUnixTimeMilliseconds();
        }

        public TheContext()
        {

            Application.ApplicationExit += new EventHandler(this.OnExit);

            logText = new StringBuilder();

            lastClickTime = getTime();
            lastMouseUp = getTime();

            Hook.GlobalEvents().MouseDownExt += async (sender, e) =>
            {
                if (e.Button == MouseButtons.Left)
                {
                    //  e.Handled = true;

                    //  writeLog("Handling click DOWN! " + e.Delta);

                    long lmu = (getTime() - lastMouseUp);

                    if (lmu < 10)
                    {
                        Debug.WriteLine("Too fast click - ignoring " + (getTime() - lastMouseUp) + Environment.NewLine);
                        e.Handled = true;
                        ignoreClick = true;
                    }

                    long lct = getTime() - lastClickTime;

                    lastClickTime = getTime();

                    Debug.WriteLine("MouseDOWN " + lct + " ( " + lmu + " ) " + Environment.NewLine);
                }
            };

            Hook.GlobalEvents().MouseUpExt += async (sender, e) =>
            {
                if (e.Button == MouseButtons.Left)
                {
                    if (!ignoreClick)
                    {

                        //  e.Handled = true;

                        //    writeLog("Handling click UP! " + e.Delta);

                        long lct = getTime() - lastClickTime;

                        lastClickTime = getTime();

                        Debug.WriteLine("MouseUP " + lct + Environment.NewLine);

                        lastMouseUp = getTime();


                    }
                    else
                    {
                        Debug.WriteLine("Ignoring click " + Environment.NewLine);

                        e.Handled = true;
                        ignoreClick = false;
                    }
                }
            };


                }

        private void OnExit(object sender, EventArgs e)
        {
          //  File.AppendAllText("log.txt", logText.ToString());
        }


    }

}
4

0 回答 0