|
Горячие клавиши - Вопросы и ответы, обсуждения - Ваши вопросы по C# только в данном разделе |
24.09.2012, 20:08
|
#1
|
|
|
|
Разведчик
|
Регистрация: 06.09.2012
Сообщений: 10
Популярность: -374
Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
|
Горячие клавиши
Здравствуйте скажите пожалуйста как сделать в программе горячие клавиши я сделал трейнер для игры MW3 сворачивать разворачивать игру всё это не удобно хотелось бы не сворачивая игру нажал на какую нить клавишу и у тебя включилась функция скажи те как реализовать это буду очень благодарен вам
|
|
|
24.09.2012, 20:27
|
#2
|
|
|
|
Пехотинец
|
Регистрация: 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пасибо:
|
|
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
|
|
|
|
Главнокомандующий
|
Регистрация: 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 сообщениях
|
Re: Горячие клавиши
________________
-Отложи на послезавтра то что можешь сделать сегодня, и тогда у тебя появятся два свободных дня!
|
|
|
Пользователь сказал cпасибо:
|
|
14.06.2014, 02:04
|
#6
|
|
|
|
Разведчик
|
Регистрация: 04.04.2009
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Горячие клавиши
Подскажите пожалуйста как прикрутить сюда выбор клавиши из comboBox
Чтоб юзер мог выбрать хоткей сам удобные ему.
|
|
|
14.06.2014, 09:43
|
#7
|
|
|
|
Сержант
|
Регистрация: 18.07.2013
Сообщений: 148
Популярность: 83981
Сказал(а) спасибо: 564
Поблагодарили 258 раз(а) в 195 сообщениях
|
Re: Горячие клавиши
|
|
|
14.06.2014, 14:37
|
#8
|
|
|
|
Рыцарь-защитник
|
Регистрация: 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
|
|
|
|
Разведчик
|
Регистрация: 04.04.2009
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Горячие клавиши
|
Цитата: |
|
|
|
|
|
|
|
|
|
Для каждой клавиши создать строковую переменную, затем во множестве условий искать выбранный comboBox и присваивать строке соответствущую клавишу. А эту строку уже в switch
|
|
|
|
|
|
Спасибо за ответ, но честно говоря не понял как такое сделать . . . хотелось бы увидеть пример, на подобие что http://zhyk.ru/forum/showpost.php?p=3549959&postcount=5 .
Был весьма благодарен за это.
|
|
|
30.06.2014, 16:17
|
#10
|
|
|
|
Разведчик
|
Регистрация: 14.10.2011
Сообщений: 13
Популярность: 559
Сказал(а) спасибо: 0
Поблагодарили 16 раз(а) в 2 сообщениях
|
Re: Горячие клавиши
|
|
|
07.07.2014, 20:58
|
#11
|
|
|
|
Разведчик
|
Регистрация: 04.04.2009
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Горячие клавиши
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Похожие темы
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Глобальные горячие клавиши
|
lxxl |
Вопросы и ответы, обсуждения |
0 |
19.08.2012 19:20 |
[Информация] Горячие клавиши
|
Vincitore |
Грани реальности |
0 |
26.02.2012 11:50 |
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 13:30.
|
|