🙂 İNSANLARIN EN HAYIRLISI INSANLARA FAYDALI OLANDIR 🙂

Ramazan HABER / C# / Klavye Mouse Eventını Her Yerde Yakalama

Klavye Mouse Eventını Her Yerde Yakalama

 

1-) C# - globalKeyboardHook.cs

 

using System;

using System.Collections.Generic;

using System.Runtime.InteropServices;

using System.Windows.Forms;

 

namespace OrderTakerUltimate.MouseKlayveHook

{

    class globalKeyboardHook

    {

        #region Constant, Structure and Delegate Definitions

        /// <summary>

        /// defines the callback type for the hook

        /// </summary>

        public delegate int keyboardHookProc(int code, int wParam, ref keyboardHookStruct lParam);

 

        public struct keyboardHookStruct

        {

            public int vkCode;

            public int scanCode;

            public int flags;

            public int time;

            public int dwExtraInfo;

        }

 

        const int WH_KEYBOARD_LL = 13;

        const int WM_KEYDOWN = 0x100;

        const int WM_KEYUP = 0x101;

        const int WM_SYSKEYDOWN = 0x104;

        const int WM_SYSKEYUP = 0x105;

        #endregion

 

        #region Instance Variables

        /// <summary>

        /// The collections of keys to watch for

        /// </summary>

        public List<Keys> HookedKeys = new List<Keys>();

        /// <summary>

        /// Handle to the hook, need this to unhook and call the next hook

        /// </summary>

        IntPtr hhook = IntPtr.Zero;

        #endregion

 

        #region Events

        /// <summary>

        /// Occurs when one of the hooked keys is pressed

        /// </summary>

        public event KeyEventHandler KeyDown;

        /// <summary>

        /// Occurs when one of the hooked keys is released

        /// </summary>

        public event KeyEventHandler KeyUp;

        #endregion

 

        #region Constructors and Destructors

        /// <summary>

        /// Initializes a new instance of the <see cref="globalKeyboardHook"/> class and installs the keyboard hook.

        /// </summary>

        public globalKeyboardHook()

        {

            hook();

        }

 

        /// <summary>

        /// Releases unmanaged resources and performs other cleanup operations before the

        /// <see cref="globalKeyboardHook"/> is reclaimed by garbage collection and uninstalls the keyboard hook.

        /// </summary>

        ~globalKeyboardHook()

        {

            unhook();

        }

        #endregion

 

        keyboardHookProc callback;

 

        #region Public Methods

        /// <summary>

        /// Installs the global hook

        /// </summary>

        public void hook()

        {

            IntPtr hInstance = LoadLibrary("User32");

 

            if (callback != null) throw new InvalidOperationException("Hook already installed");

            if (hInstance == IntPtr.Zero) hInstance = LoadLibrary("User32");

            callback = new keyboardHookProc(hookProc);

            hhook = SetWindowsHookEx(WH_KEYBOARD_LL, callback, hInstance, 0);

        }

 

        /// <summary>

        /// Uninstalls the global hook

        /// </summary>

        public void unhook()

        {

            UnhookWindowsHookEx(hhook);

            callback = null;

        }

 

        /// <summary>

        /// The callback for the keyboard hook

        /// </summary>

        /// <param name="code">The hook code, if it isn't >= 0, the function shouldn't do anyting</param>

        /// <param name="wParam">The event type</param>

        /// <param name="lParam">The keyhook event information</param>

        /// <returns></returns>

        public int hookProc(int code, int wParam, ref keyboardHookStruct lParam)

        {

            if (code >= 0)

            {

                Keys key = (Keys)lParam.vkCode;

                //aşağıyı ramazan yorum satırı yaptı eğer açarsan A ve B işler sadece

                //if (HookedKeys.Contains(key)) {

                KeyEventArgs kea = new KeyEventArgs(key);

                if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && (KeyDown != null))

                {

                    KeyDown(this, kea);

                }

                else if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && (KeyUp != null))

                {

                    KeyUp(this, kea);

                }

                if (kea.Handled)

                    return 1;

                //}

            }

            return CallNextHookEx(hhook, code, wParam, ref lParam);

        }

        #endregion

 

        #region DLL imports

        /// <summary>

        /// Sets the windows hook, do the desired event, one of hInstance or threadId must be non-null

        /// </summary>

        /// <param name="idHook">The id of the event you want to hook</param>

        /// <param name="callback">The callback.</param>

        /// <param name="hInstance">The handle you want to attach the event to, can be null</param>

        /// <param name="threadId">The thread you want to attach the event to, can be null</param>

        /// <returns>a handle to the desired hook</returns>

        [DllImport("user32.dll")]

        static extern IntPtr SetWindowsHookEx(int idHook, keyboardHookProc callback, IntPtr hInstance, uint threadId);

 

        /// <summary>

        /// Unhooks the windows hook.

        /// </summary>

        /// <param name="hInstance">The hook handle that was returned from SetWindowsHookEx</param>

        /// <returns>True if successful, false otherwise</returns>

        [DllImport("user32.dll")]

        static extern bool UnhookWindowsHookEx(IntPtr hInstance);

 

        /// <summary>

        /// Calls the next hook.

        /// </summary>

        /// <param name="idHook">The hook id</param>

        /// <param name="nCode">The hook code</param>

        /// <param name="wParam">The wparam.</param>

        /// <param name="lParam">The lparam.</param>

        /// <returns></returns>

        [DllImport("user32.dll")]

        static extern int CallNextHookEx(IntPtr idHook, int nCode, int wParam, ref keyboardHookStruct lParam);

 

        /// <summary>

        /// Loads the library.

        /// </summary>

        /// <param name="lpFileName">Name of the library</param>

        /// <returns>A handle to the library</returns>

        [DllImport("kernel32.dll")]

        static extern IntPtr LoadLibrary(string lpFileName);

        #endregion

    }

}

 

 

2-)  MouseHook.cs

 

using System;

using System.Diagnostics;

using System.Runtime.InteropServices;

 

namespace KlavyeMouseEvent

{

    /*********************************************Mouse Olayları********************************************/

    public static class MouseHook

    {

        public static event EventHandler MouseAction = delegate { };

 

        public static void Start()

        {

            _hookID = SetHook(_proc);

 

 

        }

        public static void stop()

        {

            UnhookWindowsHookEx(_hookID);

        }

 

        private static LowLevelMouseProc _proc = HookCallback;

        private static IntPtr _hookID = IntPtr.Zero;

 

        private static IntPtr SetHook(LowLevelMouseProc proc)

        {

            using (Process curProcess = Process.GetCurrentProcess())

            using (ProcessModule curModule = curProcess.MainModule)

            {

                return SetWindowsHookEx(WH_MOUSE_LL, proc,

                  GetModuleHandle(curModule.ModuleName), 0);

            }

        }

 

        private delegate IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam);

 

        private static IntPtr HookCallback(

          int nCode, IntPtr wParam, IntPtr lParam)

        {

 

            if (nCode >= 0 && MouseMessages.WM_LBUTTONDOWN == (MouseMessages)wParam)

            {

                MSLLHOOKSTRUCT hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));

                MouseAction("Sol", new EventArgs());//sol yazan yer null 'du ramazan ekledi

            }

            // ramazan ekledi

            if (nCode >= 0 && MouseMessages.WM_RBUTTONDOWN == (MouseMessages)wParam)

            {

                MSLLHOOKSTRUCT hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));

                MouseAction("Sağ", new EventArgs());//sağ yazan yer null 'du ramazan ekledi

            }

            return CallNextHookEx(_hookID, nCode, wParam, lParam);

        }

 

        private const int WH_MOUSE_LL = 14;

 

        private enum MouseMessages

        {

            WM_LBUTTONDOWN = 0x0201,

            WM_LBUTTONUP = 0x0202,

            WM_MOUSEMOVE = 0x0200,

            WM_MOUSEWHEEL = 0x020A,

            WM_RBUTTONDOWN = 0x0204,

            WM_RBUTTONUP = 0x0205

        }

 

        [StructLayout(LayoutKind.Sequential)]

        private struct POINT

        {

            public int x;

            public int y;

        }

 

        [StructLayout(LayoutKind.Sequential)]

        private struct MSLLHOOKSTRUCT

        {

            public POINT pt;

            public uint mouseData;

            public uint flags;

            public uint time;

            public IntPtr dwExtraInfo;

        }

 

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]

        private static extern IntPtr SetWindowsHookEx(int idHook,

          LowLevelMouseProc lpfn, IntPtr hMod, uint dwThreadId);

 

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]

        [return: MarshalAs(UnmanagedType.Bool)]

        private static extern bool UnhookWindowsHookEx(IntPtr hhk);

 

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]

        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,

          IntPtr wParam, IntPtr lParam);

 

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]

        private static extern IntPtr GetModuleHandle(string lpModuleName);

 

 

    }

}

 

3-)  Form1.cs  -> 1 tane ListBox koy -> Ondan sonra kodu yapıştır.

 

using System;

using System.Windows.Forms;

 

namespace OrderTakerUltimate.MouseKlayveHook

{

    public partial class MouseKlavyeHookHome : Form

    {

        globalKeyboardHook gkh;

        public MouseKlavyeHookHome()

        {

            InitializeComponent();

            /*MOUSE İÇİN*/

            MouseHook.Start();

            MouseHook.MouseAction += new EventHandler(Event);

 

            /*KLAVYE İÇİN*/

            gkh = new globalKeyboardHook();

            //gkh.HookedKeys.Add(Keys.A);

            //gkh.HookedKeys.Add(Keys.B);

            gkh.KeyDown += new KeyEventHandler(gkh_KeyDown);

            gkh.KeyUp += new KeyEventHandler(gkh_KeyUp);

        }

        private void Event(object sender, EventArgs e)

        {

            listBox1.Items.Add(sender.ToString() + " Click!");

        }

        void gkh_KeyUp(object sender, KeyEventArgs e)

        {

            //aşağıyı Ramazan HABER yorum satırı yaptı

            //listBox1.Items.Add("Up\t" + e.KeyCode.ToString());

            //e.Handled = true;

        }

        void gkh_KeyDown(object sender, KeyEventArgs e)

        {

            listBox1.Items.Add("Down\t" + e.KeyCode.ToString());

            e.Handled = true;

        }

    }

}

 

4-) BAKMASANDA OLUR. BAŞKA PROJEYE EKLERKEN BUNU EKLESEN ÇALIŞTIRMAK İÇİN YETERLİ YANİ "3-)" BAŞLIĞI EKLEMENE GEREK YOK

 

using System;

using System.Windows.Forms;

namespace KlavyeMouseEvent

{

    // BAŞKA PROJEYE EKLERKEN BUNU ÇALIŞTIRSAN YETER kullanımı -> KlavyeMouseStart calistir = new KlavyeMouseStart();

    class KlavyeMouseStart

    {

        public static string MyClass = "KlavyeMouseStart";

        globalKeyboardHook gkh;

        public KlavyeMouseStart()

        {

            try

            {

                gkh = new globalKeyboardHook();

                gkh.KeyDown += new KeyEventHandler(gkh_KeyDown);

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

 

            }

        }

        void gkh_KeyDown(object sender, KeyEventArgs e)

        {

            try

            {

                if (e.KeyCode.ToString().Equals("F9"))

                {

                    Form1 asd = new Form1(); // ARTIK HANGİ FORMU AÇACAKSAN

                    asd.Show();

                }

                e.Handled = true;

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

    }

}

 

 

 

 

AÇILAMA -> MESALA ALT+1 VEYA ALT+F1 YAPINCA ÇALIŞMIYOR BUNUN İÇİN AŞAĞIDAKİ ALGORİTMAYI KULLAN

 

  public static bool alt = false;

        public static bool altBironceki = false;

 

        void gkh_KeyDown(object sender, KeyEventArgs e) // LMenu D1

        {

            try

            {

                altBironceki = alt;

 

                if (e.KeyCode.ToString().Equals("LMenu"))

                {

                    alt = true;

                }else

                {

                    alt = false;

                }

 

                if (altBironceki && e.KeyCode==Keys.D1)

                {

                    Console.WriteLine("ALT+1");

                }

 

                if (altBironceki && e.KeyCode == Keys.F1)

                {

                    Console.WriteLine("ALT+F1");

                }

 

 

 

                //if (e.KeyCode.ToString().Equals("F9"))

                //{

                //    MyFormList.MyNewInstance();

                //}

                // e.Handled = true;

            }

            catch (Exception ex)

            {

                RHMesaj.MyMessageError(MyClass, "gkh_KeyDown", "", ex);

            }

        }

 2021 Ocak 18 Pazartesi
 466