Globalne Hotkeye

0

Witam, od jakiegoś czasu zmagam się z implementacją skrótów klawiszowych które "coś wywołuj" nawet jeżeli są użyte w grze.

Napotkałem różne problemy

  • Program potrafi czytać klawiaturę, ale tylko jeżeli okienko jest na wierzchu

  • Program potrafi czytać nawet jeżeli mamy odpaloną na full screena grę, ale:

  1. Jakby "kradnie" te klawisze. np. gdy mamy odpalony program który pobiera literę A, to pisząc w notatniku "ABC" zostaje tylko "BC"

  2. Nie potrafię sobie poradzić z błędem "Additional information: Wykonano wywołanie zwrotne usuniętego bezużytecznego obiektu delegowanego typu globalKeyboardHook+keyboardHookProc::Invoke'. Może to spowodować awarię aplikacji, uszkodzenie i utratę danych. Jeśli obiekty delegowane są przekazywane do kodu niezarządzanego, aplikacja zarządzana musi utrzymywać ich aktywność, dopóki nie będzie gwarancji, że nigdy nie zostaną wywołane."

Dopinam kod (stąd: https://www.codeproject.com/articles/19004/a-simple-c-global-low-level-keyboard-hook)

   
   globalKeyboardHook gkh = new globalKeyboardHook();
 
   private void Form1_Load(object sender, EventArgs e)
            {
                gkh.HookedKeys.Add(Keys.A);
                gkh.HookedKeys.Add(Keys.B);
                gkh.KeyDown += new KeyEventHandler(gkh_KeyDown);
                gkh.KeyUp += new KeyEventHandler(gkh_KeyUp);
            }

            void gkh_KeyUp(object sender, KeyEventArgs e)
            {
                richTextBox1.Text += ("Up\t" + e.KeyCode.ToString()) + Environment.NewLine;
                e.Handled = true;
            }

            void gkh_KeyDown(object sender, KeyEventArgs e)
            {
            richTextBox1.Text += ("Down\t" + e.KeyCode.ToString()) + Environment.NewLine;
                e.Handled = true;
            }
  class globalKeyboardHook
    {
   
       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;
     
        public List<Keys> HookedKeys = new List<Keys>();
   
        IntPtr hhook = IntPtr.Zero;
       
        public event KeyEventHandler KeyDown;
     
        public event KeyEventHandler KeyUp;

        public globalKeyboardHook()
        {
            hook();
        }

    
        ~globalKeyboardHook()
        {
            unhook();
        }

        public void hook()
        {
            IntPtr hInstance = LoadLibrary("User32");
            hhook = SetWindowsHookEx(WH_KEYBOARD_LL, hookProc, hInstance,0);
        }

  
        public void unhook()
        {
            UnhookWindowsHookEx(hhook);
        }

         public int hookProc(int code, int wParam, ref keyboardHookStruct lParam)
        {
            if (code >= 0)
            {
                Keys key = (Keys)lParam.vkCode;
                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);
        }
   
        [DllImport("user32.dll")]
        static extern IntPtr SetWindowsHookEx(int idHook, keyboardHookProc callback, IntPtr hInstance, uint threadId);

        [DllImport("user32.dll")]
        static extern bool UnhookWindowsHookEx(IntPtr hInstance);

        [DllImport("user32.dll")]
        static extern int CallNextHookEx(IntPtr idHook, int nCode, int wParam, ref keyboardHookStruct lParam);

        [DllImport("kernel32.dll")]
        static extern IntPtr LoadLibrary(string lpFileName);
 
    }

Więc pytanko, czy ma ktoś sprawdzony sposób na pobieranie przycisku lub przycisków?

0
dam1an napisał(a):

Próbowałeś stąd: http://null-byte.wonderhowto.com/how-to/create-simple-hidden-console-keylogger-c-sharp-0132757/

Wow, działa perfekto, lecz zastanawia mnie jedno:

Czy anty virusy nie będą z miejsca markowały programu jako keyloggera?

1 użytkowników online, w tym zalogowanych: 0, gości: 1