前段時間,我必須做一些喜歡你,所以我發現這篇文章:,以及與此我能夠做什麼,我需要它。
但這是一個複雜的代碼,當你這麼說,你不想做讓所有鍵不放。對於我的節目,我創建了一個KeyboardHook
類,使易與以前的文章中所獲得的代碼工作。
因此,有你可以用KeyboardHook
類做一個片斷代碼:
// Put this on the begin of your form (like the constructor on FormLoad).
var hook = new KeyboardHook();
hook.KeyDown += (sender, e) =>
{
// e.Control is a bool property if true Control is press.
// e.Shift is a bool property if true Shift is press.
// e.Key has a key that was press.
// This if ignores anything that don't begin with Control or Shift.
if(!e.Control && !e.Shift) return;
// your code below:
if(e.Control && e.Key == Keys.H)
{
// do your code here.
// like: Analyse CTRL+H and knows it need to do some task.
}
};
hook.Start(); // Until here goes in the begin of your form.
// Put this on the end of your form (like in the Dispose or FormClose).
hook.Release();
hook.Dispose();
PS:如果你把這個你ShortcutHandler應用應用程序仍然會得到鑰匙。
而且下面是KeyboardHook
代碼:
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class KeyboardHook : IDisposable
{
#region Fields
private bool _lControlKeyIsDown;
private bool _rControlKeyIsDown;
private bool _lShiftKeyIsDown;
private bool _rShiftKeyIsDown;
#endregion
#region Properties
private bool ControlIsDown
{
get { return _lControlKeyIsDown || _rControlKeyIsDown; }
}
private bool ShiftIsDown
{
get { return _lShiftKeyIsDown || _rShiftKeyIsDown; }
}
#endregion
#region Constructors
public KeyboardHook()
{
_proc = HookCallback;
}
#endregion
#region Events
public event HookKeyDownHandler KeyDown;
#endregion
#region Methods
public void Start()
{
_hookID = SetHook(_proc);
}
private static IntPtr SetHook(LowLevelKeyboardProc proc)
{
using (var curProcess = Process.GetCurrentProcess())
using (var curModule = curProcess.MainModule)
{
return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
}
}
private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0)
{
var vkCode = Marshal.ReadInt32(lParam);
var key = (Keys)vkCode;
if (wParam == (IntPtr)WM_KEYDOWN)
{
switch (key)
{
case Keys.LControlKey:
_lControlKeyIsDown = true;
break;
case Keys.RControlKey:
_rControlKeyIsDown = true;
break;
case Keys.LShiftKey:
_lShiftKeyIsDown = true;
break;
case Keys.RShiftKey:
_rShiftKeyIsDown = true;
break;
default:
if (KeyDown != null)
{
var args = new HookKeyDownEventArgs((Keys)vkCode, ShiftIsDown, ControlIsDown);
KeyDown(this, args);
}
break;
}
}
if (wParam == (IntPtr)WM_KEYUP)
{
switch (key)
{
case Keys.LControlKey:
_lControlKeyIsDown = false;
break;
case Keys.RControlKey:
_rControlKeyIsDown = false;
break;
case Keys.LShiftKey:
_lShiftKeyIsDown = false;
break;
case Keys.RShiftKey:
_rShiftKeyIsDown = false;
break;
}
}
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
public void Release()
{
UnhookWindowsHookEx(_hookID);
}
public void Dispose()
{
Release();
}
#endregion
#region Interoperability
private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;
private const int WM_KEYUP = 0x0101;
private readonly LowLevelKeyboardProc _proc;
private IntPtr _hookID = IntPtr.Zero;
private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
#endregion
}
public class HookKeyDownEventArgs : EventArgs
{
#region Fields
private readonly Keys _key;
private readonly bool _shift;
private readonly bool _control;
#endregion
#region Properties
public Keys Key
{
get { return _key; }
}
public bool Shift
{
get { return _shift; }
}
public bool Control
{
get { return _control; }
}
#endregion
#region Constructors
public HookKeyDownEventArgs(Keys key, bool shift, bool control)
{
_key = key;
_shift = shift;
_control = control;
}
#endregion
}
public delegate void HookKeyDownHandler(object sender, HookKeyDownEventArgs e);
如果你寫的其他應用程序,爲什麼不把你的應用程序告訴其他應用程序,他們需要做什麼? –
@RowlandShaw,因爲他想在任何*應用程序中掛接任意的按鍵/組合,然後在發生這種情況時在他的應用程序中執行一些操作。 – xan
全球熱鍵會幫助你嗎?你試圖做的事情聽起來有點可疑 - 也許增加了一些你想要達到的目的的解釋會有助於 – xan