Перейти к содержанию

Горячие клавиши.


kopylov

Рекомендуемые сообщения

Ребят а как сделать горячие клавиши. Вот чтобы я на C# например читы какие-то поставил на активацию клавиш в самой игре. Чтобы не на форме когда нажимаешь перехватывала нажатие, а во самой игре пока чит работает.

Ссылка на комментарий
Поделиться на другие сайты

как вариант выставлять глобальный хук:

потом приворачиваешь это к своему проекту:

using System;using System.Runtime.InteropServices;using System.Windows.Forms;using System.ComponentModel;namespace GlobalSoftKeys{    public static class Hook    {        #region Declarations        public delegate void HookKeyPress(LLKHEventArgs e);        public static event HookKeyPress KeyUp;        public static event HookKeyPress KeyDown;        [StructLayout(LayoutKind.Sequential)]        struct KBDLLHOOKSTRUCT        {            public uint vkCode;            public uint scanCode;            public KBDLLHOOKSTRUCTFlags flags;            public uint time;            public IntPtr dwExtraInfo;        }        [Flags]        enum KBDLLHOOKSTRUCTFlags : int        {            LLKHF_EXTENDED = 0x01,            LLKHF_INJECTED = 0x10,            LLKHF_ALTDOWN = 0x20,            LLKHF_UP = 0x80,        }        static IntPtr hHook = IntPtr.Zero;        static IntPtr hModule = IntPtr.Zero;        static bool hookInstall = false;        static bool localHook = true;        static API.HookProc hookDel;        #endregion        public static void InstallHook()        {            if (IsHookInstalled) return;            hModule = Marshal.GetHINSTANCE(AppDomain.CurrentDomain.GetAssemblies()[0].GetModules()[0]);            hookDel = new API.HookProc(HookProcFunction);            if (localHook)                hHook = API.SetWindowsHookEx(API.HookType.WH_KEYBOARD,                    hookDel, IntPtr.Zero, AppDomain.GetCurrentThreadId());            else                hHook = API.SetWindowsHookEx(API.HookType.WH_KEYBOARD_LL,                    hookDel, hModule, 0);            if (hHook != IntPtr.Zero)                hookInstall = true;            else                throw new Win32Exception("Can't install low level keyboard hook!");        }        public static bool IsHookInstalled        {            get { return hookInstall && hHook != IntPtr.Zero; }        }        public static IntPtr ModuleHandle        {            get { return hModule; }        }        public static bool LocalHook        {            get { return localHook; }            set            {                if (value != localHook)                {                    if (IsHookInstalled)                        throw new Win32Exception("Can't change type of hook than it install!");                    localHook = value;                }            }        }        public static void UnInstallHook()        {            if (IsHookInstalled)            {                if (!API.UnhookWindowsHookEx(hHook))                    throw new Win32Exception("Can't uninstall low level keyboard hook!");                hHook = IntPtr.Zero;                hModule = IntPtr.Zero;                hookInstall = false;            }        }        static IntPtr HookProcFunction(int nCode, IntPtr wParam, [In] IntPtr lParam)        {            if (nCode == 0)            {                LLKHEventArgs args = null;                if (localHook)                {                    bool pressed = false;                    if (lParam.ToInt32() >> 31 == 0)                        pressed = true;                    Keys keys = (Keys)wParam.ToInt32();                    args = new LLKHEventArgs(keys, pressed, 0U, 0U);                    if (pressed)                    {                        if (KeyDown != null)                            KeyDown(args);                    }                    else                    {                        if (KeyUp != null)                            KeyUp(args);                    }                }                else                {                    KBDLLHOOKSTRUCT kbd = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));                    bool pressed = false;                    if (wParam.ToInt32() == 0x100 || wParam.ToInt32() == 0x104)                        pressed = true;                    Keys keys = (Keys)kbd.vkCode;                    args = new LLKHEventArgs(keys, pressed, kbd.time, kbd.scanCode);                    if (pressed)                    {                        if (KeyDown != null)                            KeyDown(args);                    }                    else                    {                        if (KeyUp != null)                            KeyUp(args);                    }                }                if (args != null && args.Hooked)                    return (IntPtr)1;            }            return API.CallNextHookEx(hHook, nCode, wParam, lParam);        }    }    public class LLKHEventArgs    {        Keys keys;        bool pressed;        uint time;        uint scCode;        public LLKHEventArgs(Keys keys, bool pressed, uint time, uint scanCode)        {            this.keys = keys;            this.pressed = pressed;            this.time = time;            this.scCode = scanCode;        }        public Keys Keys        { get { return keys; } }        public bool IsPressed        { get { return pressed; } }        public uint Time        { get { return time; } }        public uint ScanCode        { get { return scCode; } }        public bool Hooked { get; set; }    }    static class API    {        public delegate IntPtr HookProc(int nCode, IntPtr wParam, [In] IntPtr lParam);        [DllImport("user32.dll")]        public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, [In] IntPtr lParam);        [DllImport("user32.dll", SetLastError = true)]        public static extern IntPtr SetWindowsHookEx(HookType hookType, HookProc lpfn,        IntPtr hMod, int dwThreadId);        [DllImport("user32.dll", SetLastError = true)]        public static extern bool UnhookWindowsHookEx(IntPtr hhk);        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]        public static extern IntPtr GetModuleHandle(string lpModuleName);        public enum HookType : int        {            WH_JOURNALRECORD = 0,            WH_JOURNALPLAYBACK = 1,            WH_KEYBOARD = 2,            WH_GETMESSAGE = 3,            WH_CALLWNDPROC = 4,            WH_CBT = 5,            WH_SYSMSGFILTER = 6,            WH_MOUSE = 7,            WH_HARDWARE = 8,            WH_DEBUG = 9,            WH_SHELL = 10,            WH_FOREGROUNDIDLE = 11,            WH_CALLWNDPROCRET = 12,            WH_KEYBOARD_LL = 13,            WH_MOUSE_LL = 14        }    }}
using GlobalSoftKeys;//подключаем наш классusing System.Runtime.InteropServices;//для работы с DllImport

и потом используешь все что написал выше:

в общем это тапорный метод.... можно еще изобрести способы, более углубленные и грамотные.....

NullAlex: Большой код принято оборачивать в тег спойлера. Читай FAQ по тегу. Это - последнее устное предупреждение.

List<Keys> _pressedKeys;        [DllImport("User32.dll")]        public static extern int SendInput(int nInputs, ref INPUT pInputs, int cbSize);        [DllImport("User32.dll")]        static extern short GetAsyncKeyState(Int32 vKey);        public struct INPUT        {            public int type;        }        void KBDHook_KeyUp(GlobalSoftKeys.LLKHEventArgs e)        {            _pressedKeys.Remove(e.Keys);        }
_pressedKeys = new List<Keys>();            Hook.KeyDown += new Hook.HookKeyPress(KBDHook_KeyDown);            Hook.KeyUp += new Hook.HookKeyPress(KBDHook_KeyUp);            Hook.LocalHook = false;            Hook.InstallHook();            this.FormClosed += (s, e) =>            {                Hook.UnInstallHook();            };
 //---Непосредственно наши установки для хука        void KBDHook_KeyDown(GlobalSoftKeys.LLKHEventArgs e)        {            if (!_pressedKeys.Contains(e.Keys))            {                _pressedKeys.Add(e.Keys);            }            //---Это указание нашей клавиши для определенного действия            if (_pressedKeys.IndexOf((Keys)int.Parse("45")) != -1)// 45 - это десятичный код нужной нам клавиши            {                MessageBox.Show("Перехват успешен!", "Проверка");// действие при нажатии указанной клавиши            }        }
Ссылка на комментарий
Поделиться на другие сайты

в общем это тапорный метод.... можно еще изобрести способы, более углубленные и грамотные.....

 

Я конечно все понимаю, это хорошая работа но опять забыли про спойлер.

 

Админы будут не довольны.

Код нужно убирать под спойлер. Читайте правила форума.....

 

Вот читайте и запоминайте - http://forum.gamehacklab.ru/topic/3116-instruktciia-kak-ispolzovat-teg-spojlera/

Изменено пользователем Dison
Ссылка на комментарий
Поделиться на другие сайты

Как я понял создаем класс, в нем пишем глобальный хук этот. Потом подключаем класс к проекту, потом подключаем сборку interop. А как вызвать обработчик события? Вот у меня например чтобы на клавишу 7 активировалась антиотдача.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.