kopylov Опубликовано 28 июня, 2015 Поделиться Опубликовано 28 июня, 2015 Ребят а как сделать горячие клавиши. Вот чтобы я на C# например читы какие-то поставил на активацию клавиш в самой игре. Чтобы не на форме когда нажимаешь перехватывала нажатие, а во самой игре пока чит работает. Ссылка на комментарий Поделиться на другие сайты Поделиться
Крайслер Опубликовано 28 июня, 2015 Поделиться Опубликовано 28 июня, 2015 как вариант выставлять глобальный хук:потом приворачиваешь это к своему проекту: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("Перехват успешен!", "Проверка");// действие при нажатии указанной клавиши } } Ссылка на комментарий Поделиться на другие сайты Поделиться
Dison Опубликовано 28 июня, 2015 Поделиться Опубликовано 28 июня, 2015 (изменено) в общем это тапорный метод.... можно еще изобрести способы, более углубленные и грамотные..... Я конечно все понимаю, это хорошая работа но опять забыли про спойлер. Админы будут не довольны.Код нужно убирать под спойлер. Читайте правила форума..... Вот читайте и запоминайте - http://forum.gamehacklab.ru/topic/3116-instruktciia-kak-ispolzovat-teg-spojlera/ Изменено 28 июня, 2015 пользователем Dison Ссылка на комментарий Поделиться на другие сайты Поделиться
kopylov Опубликовано 28 июня, 2015 Автор Поделиться Опубликовано 28 июня, 2015 Как я понял создаем класс, в нем пишем глобальный хук этот. Потом подключаем класс к проекту, потом подключаем сборку interop. А как вызвать обработчик события? Вот у меня например чтобы на клавишу 7 активировалась антиотдача. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения