//屏蔽键盘 using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.IO; using System.Reflection;namespace KeyboardDLL { public class KeyboardHook { public delegate int KeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); static int hKeyboardHook = 0; KeyboardProc KeyboardHookProcedure; /// <summary> /// 钩子函数,需要引用空间(using System.Reflection;) /// 线程钩子监听键盘消息设为2,全局钩子监听键盘消息设为13 /// 线程钩子监听鼠标消息设为7,全局钩子监听鼠标消息设为14 /// </summary> public const int WH_KEYBOARD = 13; public const int WH_MOUSE_LL = 14;
public struct KeyboardMSG { public int vkCode; public int scanCode; public int flags; public int time; public int dwExtraInfo; public int VK_CONTROL; public int VK_MENU; public int VK_DELETE; } /// <summary> /// kernel32.dll是Windows 95,Windows 98和Windows Me中使用的32位动态链接库文件。 /// kernel32.dll是负责内存管理、输入输出以及中断等工作。启动Windows系统之后, /// kernel32.dll就会被装载到不会被其他应用程序影响的受保护的内存空间中。在某些时候, /// 会出现invalid page fault(IPF)错误信息,这是由于其他应用程序视图访问kernel32.dll /// 所在的受保护内存空间引起的。不过有时,特定的某些程序也能引起这种错误。 /// </summary> /// <returns></returns> [DllImport("kernel32")] public static extern int GetCurrentThreadId(); [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern int SetWindowsHookEx(int idHook, KeyboardProc lpfn, IntPtr hInstance, int threadId); [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern bool UnhookWindowsHookEx(int idHook); [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam); private int KeyboardHookProc(int nCode, IntPtr wParam, IntPtr lParam) { KeyboardMSG m = (KeyboardMSG)Marshal.PtrToStructure(lParam, typeof(KeyboardMSG));
if ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt) { // 不知道这样行不行, 需要测试一下... } return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam); } // 安装钩子 public void KeyMaskStart() { if (hKeyboardHook == 0) { // 创建HookProc实例 KeyboardHookProcedure = new KeyboardProc(KeyboardHookProc); // 设置线程钩子 hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0); // 如果设置钩子失败 if (hKeyboardHook == 0) { KeyMaskStop(); throw new Exception("SetWindowsHookEx failed."); } } } // 卸载钩子 public void KeyMaskStop() { bool retKeyboard = true; if (hKeyboardHook != 0) { retKeyboard = UnhookWindowsHookEx(hKeyboardHook); hKeyboardHook = 0; } if (!(retKeyboard)) { throw new Exception("UnhookWindowsHookEx failed."); } } } }(int)Control.ModifierKeys == (int)Keys.Control + (int)Kyes.Alt
//屏蔽键盘
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;
using System.Reflection;namespace KeyboardDLL
{
public class KeyboardHook
{
public delegate int KeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); static int hKeyboardHook = 0;
KeyboardProc KeyboardHookProcedure; /// <summary>
/// 钩子函数,需要引用空间(using System.Reflection;)
/// 线程钩子监听键盘消息设为2,全局钩子监听键盘消息设为13
/// 线程钩子监听鼠标消息设为7,全局钩子监听鼠标消息设为14
/// </summary> public const int WH_KEYBOARD = 13;
public const int WH_MOUSE_LL = 14;
public struct KeyboardMSG
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
public int VK_CONTROL;
public int VK_MENU;
public int VK_DELETE;
} /// <summary>
/// kernel32.dll是Windows 95,Windows 98和Windows Me中使用的32位动态链接库文件。
/// kernel32.dll是负责内存管理、输入输出以及中断等工作。启动Windows系统之后,
/// kernel32.dll就会被装载到不会被其他应用程序影响的受保护的内存空间中。在某些时候,
/// 会出现invalid page fault(IPF)错误信息,这是由于其他应用程序视图访问kernel32.dll
/// 所在的受保护内存空间引起的。不过有时,特定的某些程序也能引起这种错误。
/// </summary>
/// <returns></returns>
[DllImport("kernel32")]
public static extern int GetCurrentThreadId(); [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, KeyboardProc lpfn, IntPtr hInstance, int threadId); [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook); [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam); private int KeyboardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
KeyboardMSG m = (KeyboardMSG)Marshal.PtrToStructure(lParam, typeof(KeyboardMSG));
if ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt)
{
// 不知道这样行不行, 需要测试一下...
} return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
} // 安装钩子
public void KeyMaskStart()
{
if (hKeyboardHook == 0)
{
// 创建HookProc实例
KeyboardHookProcedure = new KeyboardProc(KeyboardHookProc); // 设置线程钩子
hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardHookProcedure,
Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
// 如果设置钩子失败
if (hKeyboardHook == 0)
{
KeyMaskStop();
throw new Exception("SetWindowsHookEx failed.");
}
}
} // 卸载钩子
public void KeyMaskStop()
{
bool retKeyboard = true;
if (hKeyboardHook != 0)
{
retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
hKeyboardHook = 0;
}
if (!(retKeyboard))
{
throw new Exception("UnhookWindowsHookEx failed.");
}
}
}
}(int)Control.ModifierKeys == (int)Keys.Control + (int)Kyes.Alt
窗体和控件都有KeyDown,KeyUp,KeyPress三个事件,每个时间都会有KeyEventArgs参数传入,只要判断传入参数的KeyChar就可以了,Framework提供了Keys枚举来表示键盘上的各个键。核心判断的代码如下:
1.单键判断
if (e.KeyCode == Keys.Delete)
{
//处理逻辑
}
2.组合建判断:
if (e.Modifiers.CompareTo(Keys.Control) == 0 && e.KeyCode == Keys.Delete)
{
//处理逻辑
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/HowkWolf/archive/2008/12/01/3419626.aspx
======
or
C#判断是否按下了组合键
private void txt_name_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if(this.btn_ok.Text=="修改(&S)")
{
if(e.Modifiers==Keys.Alt&&e.KeyCode==Keys.X)//不能是e.KeyData
{
txt_name.ReadOnly=false;
}
}
}
---------------------------------------------------------------------------------------
private void dataGrid3_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
//在dataGrid3里按下(Alt+a)组合键,直接通过该单的所有明细
if(e.Alt&&e.KeyCode==Keys.A) {}
}
if ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt)
{
Console.WriteLine("按下了Ctrl+ Alt");
Return 1;}
C#里有没有简化的方法不知道。
但是以前,我都是调用WindowsAPI完成这些工作的。
效果就是:软件启动后,在后台运行,在桌面上点击注册的热键(如:Ctrl+Alt),就调出软件的界面。
函数是:
软件运行的时候:RegisterHotKey
软件推出的时候:UnRegisterHotKey
还要捕捉一些系统消息。