Регистрация Главная Сообщество
Сообщения за день Справка Регистрация

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

-

Вопросы и ответы, обсуждения

- Ваши вопросы по C# только в данном разделе

Ответ
 
Опции темы
Старый 24.09.2012, 20:08   #1
Заблокирован
 Разведчик
Аватар для Вырубатель
 
Вырубатель неизвестен в этих краяхВырубатель неизвестен в этих краяхВырубатель неизвестен в этих краяхВырубатель неизвестен в этих краях
Регистрация: 06.09.2012
Сообщений: 10
Популярность: -374
Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
 
По умолчанию Горячие клавиши

Здравствуйте скажите пожалуйста как сделать в программе горячие клавиши я сделал трейнер для игры MW3 сворачивать разворачивать игру всё это не удобно хотелось бы не сворачивая игру нажал на какую нить клавишу и у тебя включилась функция скажи те как реализовать это буду очень благодарен вам
  Ответить с цитированием
Старый 24.09.2012, 20:27   #2
 Пехотинец
Аватар для Nek1t
 
Nek1t на правильном путиNek1t на правильном пути
Регистрация: 31.08.2010
Сообщений: 64
Популярность: 129
Сказал(а) спасибо: 30
Поблагодарили 12 раз(а) в 7 сообщениях
 
По умолчанию Re: Горячие клавиши

Класс:
Код:
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
  public static class HotKey
  {
    #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

    /// <summary>
    /// Ставим хук
    /// </summary>
    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!");
    }
    /// <summary>
    /// Если хук стоит возвращаем true иначе false
    /// </summary>
    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;
        }
      }
    }
    /// <summary>
    /// Удаляем хук
    /// </summary>
    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;
      }
    }
    /// <summary>
    /// Hook process messages.
    /// </summary>
    /// <param name="nCode"></param>
    /// <param name="wParam"></param>
    /// <param name="lParam"></param>
    /// <returns></returns>
    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;
    }

    /// <summary>
    /// Key.
    /// </summary>
    public Keys Keys
    { get { return keys; } }
    /// <summary>
    /// Is key pressed or no.
    /// </summary>
    public bool IsPressed
    { get { return pressed; } }
    /// <summary>
    /// The time stamp for this message, equivalent to what GetMessageTime would return for this message.
    /// </summary>
    public uint Time
    { get { return time; } }
    /// <summary>
    /// A hardware scan code for the key.
    /// </summary>
    public uint ScanCode
    { get { return scCode; } }
    /// <summary>
    /// Is user hook key.
    /// </summary>
    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
    }
  }
}
Пример:
Код:
namespace WindowsFormsApplication1
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();

      HotKey.KeyDown += new HotKey.HookKeyPress(HotKey_KeyDown);
      HotKey.LocalHook = false;
      HotKey.InstallHook();
      this.FormClosed += (s, e) =>
      {
        HotKey.UnInstallHook();
      };
    }
    private void HotKey_KeyDown(LLKHEventArgs e)
    {
      switch (e.Keys.ToString())
      {
        case "F4":
            //Код
            break;
      }
    }
  }
}
________________
Спасибо.
  Ответить с цитированием
Пользователь сказал cпасибо:
object (26.09.2012)
Старый 24.09.2012, 23:24   #3
Заблокирован
 Разведчик
Аватар для Вырубатель
 
Вырубатель неизвестен в этих краяхВырубатель неизвестен в этих краяхВырубатель неизвестен в этих краяхВырубатель неизвестен в этих краях
Регистрация: 06.09.2012
Сообщений: 10
Популярность: -374
Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
 
По умолчанию Re: Горячие клавиши

всё норм спс

Последний раз редактировалось Вырубатель; 24.09.2012 в 23:29.
  Ответить с цитированием
Старый 26.09.2012, 00:24   #4
обжигающий
 Главнокомандующий
Аватар для object
 
object сломал счётчик популярности :(object сломал счётчик популярности :(object сломал счётчик популярности :(object сломал счётчик популярности :(object сломал счётчик популярности :(object сломал счётчик популярности :(object сломал счётчик популярности :(object сломал счётчик популярности :(object сломал счётчик популярности :(object сломал счётчик популярности :(object сломал счётчик популярности :(
Регистрация: 17.11.2009
Сообщений: 1,062
Популярность: 64819
Золото Zhyk.Ru: 170
Сказал(а) спасибо: 1,456
Поблагодарили 2,062 раз(а) в 822 сообщениях
 
По умолчанию Re: Горячие клавиши

Nek1t, мне кажется или данный класс ловит только 1 кнопку?
  Ответить с цитированием
Старый 26.09.2012, 01:19   #5
 Старший сержант
Аватар для крайслер
 
крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(крайслер сломал счётчик популярности :(
Регистрация: 04.02.2011
Сообщений: 198
Популярность: 12244
Сказал(а) спасибо: 453
Поблагодарили 435 раз(а) в 242 сообщениях
Отправить сообщение для крайслер с помощью Skype™
 
По умолчанию Re: Горячие клавиши

Цитата:
Сообщение от objectПосмотреть сообщение
Nek1t, мне кажется или данный класс ловит только 1 кнопку?

Так можно же и докрутить нужное:

Код:
switch (e.Keys.ToString())
      {
        case "F4":
            //Код1
 MessageBox.Show("Вы нажали f4");
            break;
        case "F5":
            //Код2
            MessageBox.Show("Вы нажали f5");
            break;
        case "E":
            //Код3
             MessageBox.Show("Вы нажали Е");
            break;
      }
________________

-Отложи на послезавтра то что можешь сделать сегодня, и тогда у тебя появятся два свободных дня!
  Ответить с цитированием
Пользователь сказал cпасибо:
object (04.06.2013)
Старый 14.06.2014, 02:04   #6
Заблокирован
 Разведчик
Аватар для wolf888
 
wolf888 никому не известный тип
Регистрация: 04.04.2009
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
Exclamation Re: Горячие клавиши

Цитата:
Сообщение от крайслерПосмотреть сообщение
Так можно же и докрутить нужное:

Код:
switch (e.Keys.ToString())
      {
        case "F4":
            //Код1
 MessageBox.Show("Вы нажали f4");
            break;
        case "F5":
            //Код2
            MessageBox.Show("Вы нажали f5");
            break;
        case "E":
            //Код3
             MessageBox.Show("Вы нажали Е");
            break;
      }

Подскажите пожалуйста как прикрутить сюда выбор клавиши из comboBox
Чтоб юзер мог выбрать хоткей сам удобные ему.
  Ответить с цитированием
Старый 14.06.2014, 09:43   #7
Почетный Пользователь
 Сержант
Аватар для MembRupt
 
MembRupt сломал счётчик популярности :(MembRupt сломал счётчик популярности :(MembRupt сломал счётчик популярности :(MembRupt сломал счётчик популярности :(MembRupt сломал счётчик популярности :(MembRupt сломал счётчик популярности :(MembRupt сломал счётчик популярности :(MembRupt сломал счётчик популярности :(MembRupt сломал счётчик популярности :(MembRupt сломал счётчик популярности :(MembRupt сломал счётчик популярности :(
Регистрация: 18.07.2013
Сообщений: 148
Популярность: 83981
Сказал(а) спасибо: 564
Поблагодарили 258 раз(а) в 195 сообщениях
 
По умолчанию Re: Горячие клавиши

Цитата:
Сообщение от wolf888Посмотреть сообщение
Подскажите пожалуйста как прикрутить сюда выбор клавиши из comboBox
Чтоб юзер мог выбрать хоткей сам удобные ему.

Для каждой клавиши создать строковую переменную, затем во множестве условий искать выбранный comboBox и присваивать строке соответствущую клавишу. А эту строку уже в switch
  Ответить с цитированием
Старый 14.06.2014, 14:37   #8
Читер-спонсор
 Рыцарь-защитник
Аватар для Nickitee
 
Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(
Регистрация: 28.08.2009
Сообщений: 603
Популярность: 19129
Золото Zhyk.Ru: 500
Сказал(а) спасибо: 84
Поблагодарили 602 раз(а) в 321 сообщениях
 
По умолчанию Re: Горячие клавиши

Код:
[DllImport("user32.dll")]
internal static extern ushort GetAsyncKeyState(int vKey);

public static ushort down = 32768;

void looping()
{
while(true)
{
if (GetAsyncKeyState((int)Keys.A) == down)
{
MessageBox.Show("A");
}
Thread.Sleep(200);
}
}

new Thread(looping).Start();
________________
We are Ducks. We are birds. We like bread. We cryack. Cryack.
  Ответить с цитированием
Старый 14.06.2014, 18:59   #9
Заблокирован
 Разведчик
Аватар для wolf888
 
wolf888 никому не известный тип
Регистрация: 04.04.2009
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Горячие клавиши

Цитата:
Сообщение от MembRuptПосмотреть сообщение
Для каждой клавиши создать строковую переменную, затем во множестве условий искать выбранный comboBox и присваивать строке соответствущую клавишу. А эту строку уже в switch

Спасибо за ответ, но честно говоря не понял как такое сделать . . . хотелось бы увидеть пример, на подобие что http://zhyk.ru/forum/showpost.php?p=3549959&postcount=5 .
Был весьма благодарен за это.
  Ответить с цитированием
Старый 30.06.2014, 16:17   #10
 Разведчик
Аватар для lxxl
 
lxxl излучает ауруlxxl излучает ауруlxxl излучает ауруlxxl излучает ауруlxxl излучает ауруlxxl излучает ауру
Регистрация: 14.10.2011
Сообщений: 13
Популярность: 559
Сказал(а) спасибо: 0
Поблагодарили 16 раз(а) в 2 сообщениях
 
По умолчанию Re: Горячие клавиши

Цитата:
Сообщение от wolf888Посмотреть сообщение
Подскажите пожалуйста как прикрутить сюда выбор клавиши из comboBox
Чтоб юзер мог выбрать хоткей сам удобные ему.

Код:
void KeyBordHook_KeyDown(LLKHEventArgs e)
        {
            if (e.Keys.ToString() == comboBox1.SelectedItem.ToString())
            {
                //код
            }
        }
  Ответить с цитированием
Старый 07.07.2014, 20:58   #11
Заблокирован
 Разведчик
Аватар для wolf888
 
wolf888 никому не известный тип
Регистрация: 04.04.2009
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Горячие клавиши

Цитата:
Сообщение от lxxlПосмотреть сообщение
Код:
void KeyBordHook_KeyDown(LLKHEventArgs e)
        {
            if (e.Keys.ToString() == comboBox1.SelectedItem.ToString())
            {
                //код
            }
        }

Спасибо большое!
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Глобальные горячие клавиши lxxl Вопросы и ответы, обсуждения 0 19.08.2012 19:20
[Информация] Горячие клавиши Vincitore Грани реальности 0 26.02.2012 11:50

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 13:30.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net