如题:“做一个Debug窗口,当用户输入一串字母后弹出一个窗口,用于后台配置”,对于任意时刻,检测用户输入一串特定的字母,用什么方法做最简单?我知道键盘钩子可以实现,有没有什么其它简单的方法?
解决方案 »
- Visio二次开发,关于图形文字的样式
- Winform 数据量大的情况下多线程插入数据 通过进度条显示
- 崩溃!180个错误!office卸载重装后…word组件出问题了~
- switch case
- C#如何在本机磁盘上生成文件夹?没多少分了,求各位赐教~
- 我想把一个数存在数组里,那这个数组怎么写啊.有谁能帮我写一个吗?在这先谢了...
- c# 公式的问题
- 关于打印纸设置问题?
- 一个很久以前就在CSDN请教过的dataGrid问题!!一直都没有很好的解决!!希望大家在帮帮我!谢谢!!
- 新手怎样学习C#更好一点?请各位指点一二
- C#清除缓冲区数据(急)
- WinForm连接数据库,语句执行查不到结果,但连接和命令执行没出错,查询语句复制到数据库查询可查到结果,是怎么回事,求大神指点。
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;namespace WebClick_Tool
{
public class KeyPress_o
{
[StructLayout(LayoutKind.Sequential)]
public class KeyBoardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
//委托
public delegate int HookProc(int nCode, int wParam, IntPtr lParam);
static int hHook = 0;
public const int WH_KEYBOARD_LL = 13;
//LowLevel键盘截获,如果是WH_KEYBOARD=2,并不能对系统键盘截取,Acrobat Reader会在你截取之前获得键盘。
static HookProc KeyBoardHookProcedure; //设置钩子
[DllImport("user32.dll")]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
//抽掉钩子
public static extern bool UnhookWindowsHookEx(int idHook);
[DllImport("user32.dll")]
//调用下一个钩子
public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);
[DllImport("kernel32.dll")]
public static extern int GetCurrentThreadId();
[DllImport("kernel32.dll")]
public static extern IntPtr GetModuleHandle(string name); public static void Hook_Start()
{
if (hHook == 0)
{
KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure,
GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
//如果设置钩子失败.
if (hHook == 0)
{
Hook_Clear();
}
}
} /// <summary>
/// 取消钩子事件
/// </summary>
public static void Hook_Clear()
{
bool retKeyboard = true;
if (hHook != 0)
{
retKeyboard = UnhookWindowsHookEx(hHook);
hHook = 0;
}
} public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
{
if (nCode >= 0)
{
KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
Keys k = (Keys)Enum.Parse(typeof(Keys), kbh.vkCode.ToString());
switch (k)
{
case Keys.F2:
if (kbh.flags == 0)
{
// 这里写按下后做什么事
//Main.GB = true;
MainForm.Fs(FormBorderStyle.FixedSingle);
MainForm.StopAll = true;
MainForm.DisMes("停止...");
MainForm.Enb(true);
}
else if (kbh.flags == 128)
{
//放开后做什么事
}
return 1;
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
}
}
使用方法
/// 键盘Hook管理类
/// </summary>
public class KeyHook
{
private const int WH_KEYBOARD_LL = 13; //键盘
private const int WM_KEYDOWN = 0x0108;
private const int WM_SYSKEYDOWN = 0x0104;
//键盘处理事件委托.
private delegate int HookHandle(int nCode, int wParam, IntPtr lParam);
//客户端键盘处理事件
public delegate void ProcessKeyHandle(HookStruct param, out bool handle);
//接收SetWindowsHookEx返回值
private static int _hHookValue = 0;
//勾子程序处理事件
private static HookHandle _KeyBoardHookProcedure;
//Hook结构
[StructLayout(LayoutKind.Sequential)]
public class HookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
//设置钩子
[DllImport("user32.dll")]
private static extern int SetWindowsHookEx(int idHook, HookHandle lpfn, IntPtr hInstance, int threadId);
//取消钩子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern bool UnhookWindowsHookEx(int idHook);
//调用下一个钩子
[DllImport("user32.dll")]
private static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);
//获取当前线程ID
[DllImport("kernel32.dll")]
private static extern int GetCurrentThreadId();
//Gets the main module for the associated process.
[DllImport("kernel32.dll")]
private static extern IntPtr GetModuleHandle(string name);
private IntPtr _hookWindowPtr = IntPtr.Zero;
//外部调用的键盘处理事件
private static ProcessKeyHandle _clientMethod = null;
/// <summary>
/// 安装勾子
/// <summary>
/// <param name="hookProcess">外部调用的键盘处理事件</param>
public void InstallHook(ProcessKeyHandle clientMethod)
{
_clientMethod = clientMethod;
// 安装键盘钩子
if (_hHookValue == 0)
{
_KeyBoardHookProcedure = new HookHandle(GetHookProc);
_hookWindowPtr = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
_hHookValue = SetWindowsHookEx(WH_KEYBOARD_LL, _KeyBoardHookProcedure, _hookWindowPtr, 0);
//如果设置钩子失败.
if (_hHookValue == 0)
UninstallHook();
}
}
//取消钩子事件
public void UninstallHook()
{
if (_hHookValue != 0)
{
bool ret = UnhookWindowsHookEx(_hHookValue);
if (ret) _hHookValue = 0;
}
}
//钩子事件内部调用,调用_clientMethod方法转发到客户端应用。
private static int GetHookProc(int nCode, int wParam, IntPtr lParam)
{
if (nCode >= 0)
{
//转换结构
HookStruct hookStruct = (HookStruct)Marshal.PtrToStructure(lParam, typeof(HookStruct));
if (_clientMethod != null)
{
bool handle = false;
//调用客户提供的事件处理程序。
_clientMethod(hookStruct, out handle);
if (handle) return 1; //1:表示拦截键盘,return 退出
}
}
return CallNextHookEx(_hHookValue, nCode, wParam, lParam);
}
}
http://www.cnblogs.com/zeroone/archive/2010/03/31/1701084.html
{
//case Keys.F2:
// if (kbh.flags == 0)
// {
// // 这里写按下后做什么事
// //Main.GB = true;
// MainForm.Fs(FormBorderStyle.FixedSingle);
// MainForm.StopAll = true;
// MainForm.DisMes("停止...");
// MainForm.Enb(true);
// }
// else if (kbh.flags == 128)
// {
// //放开后做什么事
// }
case Keys.D:
i = 0;
i++;
break;
case Keys.E:
if (i == 1) i++;
break;
case Keys.B:
if (i == 2) i++;
break;
case Keys.U:
if (i == 3) i++;
break;
case Keys.G:
if (i == 4) i++;
break;
case Keys.Enter:
if (i == 5)
{
i = 0;
MessageBox.Show("1");
return 1;
}
break;
default:
i = 0;
break;
}
其实我不是很明白if (handle) return 1; //1:表示拦截键盘,return 退出这句,注释掉之后还是能再截获键盘的。
就是如果弹出MessageBox显示大概几秒钟后会自动消失,但是一般的WinForm窗口就不会。觉得很奇怪。
错了勿喷。
键盘钩子:/// <summary>
/// 键盘Hook管理类
/// </summary>
public class KeyHook
{
private const int WH_KEYBOARD_LL = 13; //键盘
//private const int WM_KEYDOWN = 0x0108;
//private const int WM_SYSKEYDOWN = 0x0104; //键盘处理委托.
private delegate int HookHandle(int nCode, int wParam, IntPtr lParam);
//接收SetWindowsHookEx返回值
private static int _hHookValue = 0;
//勾子程序处理委托
private static HookHandle _KeyBoardHookProcedure;
//Hook结构
[StructLayout(LayoutKind.Sequential)]
public class HookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
//设置钩子
[DllImport("user32.dll")]
private static extern int SetWindowsHookEx(int idHook, HookHandle lpfn, IntPtr hInstance, int threadId);
//取消钩子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern bool UnhookWindowsHookEx(int idHook);
//调用下一个钩子
[DllImport("user32.dll")]
private static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);
//获取当前线程ID
[DllImport("kernel32.dll")]
private static extern int GetCurrentThreadId();
//Gets the main module for the associated process.
[DllImport("kernel32.dll")]
private static extern IntPtr GetModuleHandle(string name);
private IntPtr _hookWindowPtr = IntPtr.Zero; //客户端键盘处理委托
public delegate void ProcessKeyHandle(HookStruct param, out bool handle); //委托
//外部调用的键盘处理委托
private static ProcessKeyHandle _clientMethod = null; //委托的实例
static int i = 0; public delegate void ShowFormDebugDelegate();
public static ShowFormDebugDelegate sfDel;
public static FormDebug formDebug = null; /// <summary>
/// 和委托具有相同签名的方法
/// </summary>
/// <param name="param"></param>
/// <param name="handle"></param>
public static void ProcessKeyHandleProc(HookStruct param, out bool handle)
{
Keys k = (Keys)Enum.Parse(typeof(Keys), param.vkCode.ToString());
handle = false;
switch(k)
{
case Keys.D:
i = 0;
i++;
break;
case Keys.E:
if (i == 1) i++;
break;
case Keys.B:
if (i == 2) i++;
break;
case Keys.U:
if (i == 3) i++;
break;
case Keys.G:
if (i == 4) i++;
break;
case Keys.Enter:
if (i == 5)
{
i = 0;
//MessageBox.Show("1");
//formDebug = FormDebug.GetFormDebug();
//formDebug.Show(); KeyHook.sfDel = new ShowFormDebugDelegate(KeyHook.ShowFormDebug);
sfDel();
handle = true;
}
break;
default:
i = 0;
break;
}
} static void ShowFormDebug()
{
//formDebug = FormDebug.GetFormDebug(); //单例模式
//formDebug.Show();
if (formDebug==null || formDebug.IsDisposed)
{
formDebug = new FormDebug();
formDebug.Show();
}
//MessageBox.Show("1");
} /// <summary>
/// 安装勾子
/// <summary>
/// <param name="hookProcess">外部调用的键盘处理委托</param>
public void InstallHook(ProcessKeyHandle clientMethod)
{
_clientMethod = clientMethod;
// 安装键盘钩子
if (_hHookValue == 0)
{
_KeyBoardHookProcedure = new HookHandle(GetHookProc);
_hookWindowPtr = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
_hHookValue = SetWindowsHookEx(WH_KEYBOARD_LL, _KeyBoardHookProcedure, _hookWindowPtr, 0);
//如果设置钩子失败.
if (_hHookValue == 0)
UninstallHook();
}
} //取消钩子
public void UninstallHook()
{
if (_hHookValue != 0)
{
bool ret = UnhookWindowsHookEx(_hHookValue);
if (ret) _hHookValue = 0;
}
} //钩子事件内部调用,调用_clientMethod方法转发到客户端应用。
private static int GetHookProc(int nCode, int wParam, IntPtr lParam)
{
if (nCode >= 0)
{
//转换结构
HookStruct hookStruct = (HookStruct)Marshal.PtrToStructure(lParam, typeof(HookStruct));
if (_clientMethod != null)
{
bool handle = false;
_clientMethod(hookStruct, out handle); //调用客户提供的处理程序
if (handle) return 1; //1:表示拦截键盘,return 退出
}
}
return CallNextHookEx(_hHookValue, nCode, wParam, lParam);
}
}调用: KeyHook keyhook = new KeyHook();
KeyHook.ProcessKeyHandle clientMethod = new KeyHook.ProcessKeyHandle(KeyHook.ProcessKeyHandleProc); //初始化委托
keyhook.InstallHook(clientMethod);