使用C#创建的应用程序具有线程挂起

时间:2019-07-25 05:35:19

标签: c#

在Visual Studio C#中,我正在创建一个应用程序,该应用程序通过挂钩来记录鼠标的移动以跟踪鼠标的移动。

此应用程序在正常情况下运行良好,但是当任务管理器或特定游戏正在运行时,线程将停止并且该应用程序将无法运行。 但是,当我再次单击应用程序窗口时,它将再次跟踪鼠标的移动。 运行任务管理器或特定游戏时,如何使该应用程序正常工作?

class Hook
{
    static private DateTime Set_time;

    public static class GlobalMouseHook
    {
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern int SetWindowsHookEx(int idHook, HookProc Ipfn, IntPtr hlnstance, int threadld);

        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern bool UnhookWindowsHookEx(int idHook);

        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);

        public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParm);
    }

    public static class MouseHook
    {
        [StructLayout(LayoutKind.Sequential)]
        public class POINT
        {
            public int x;
            public int y;
        }
        [StructLayout(LayoutKind.Sequential)]
        public class MouseHookStruct
        {
            public POINT pt;
            public int hwnd;
            public int wHitTestCode;
            public int dwExtraInfo;
        }
        public const int WH_MOUSE_LL = 14;

        public static int hookHandle = 0;
        private static GlobalMouseHook.HookProc callbackDelegate;
        public static void StartHook(DateTime Set_time)
        {
            Hook.Set_time = Set_time;
            callbackDelegate = new GlobalMouseHook.HookProc(CallBack);
            if (hookHandle != 0)
            {
                return;
            }
            hookHandle = GlobalMouseHook.SetWindowsHookEx(WH_MOUSE_LL, callbackDelegate, IntPtr.Zero, 0);
        }
        public static void StopHook()
        {
            GlobalMouseHook.UnhookWindowsHookEx(hookHandle);
        }
        private enum MouseMessages
        {
            WM_LBUTTONDOWN = 0x0201,
            WM_LBUTTONUP = 0x0202,
            WM_MOUSEMOVE = 0x0200,
            WM_MOUSEWHEEL = 0x020A,
            WM_RBUTTONDOWN = 0x0204,
            WM_RBUTTONUP = 0x0205
        }
        public static int CallBack(int nCode, IntPtr wParam, IntPtr lParam)
        {
            MouseHookStruct mouseInput = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));
            System.Diagnostics.Debug.WriteLine(mouseInput.pt.x + " : " + mouseInput.pt.y);
            System.Diagnostics.Debug.WriteLine((MouseMessages)wParam);
            System.Diagnostics.Debug.WriteLine(DateTime.Now-Set_time);

            return GlobalMouseHook.CallNextHookEx(hookHandle, nCode, wParam, lParam);
        }
    }
}

我附加了附加代码以使用该挂钩代码。

public Form1 ()
{
      Hook.MouseHook.StartHook (DateTime.Now);
      InitializeComponent ();
 }

0 个答案:

没有答案