最近研究一个键盘钩子 有些问题想咨询下!

澄仙 2012-06-05 08:14:10
最近研究一个键盘钩子,用于设计一个快捷按键后触发一些事件

要在按完快捷键之后执行一个显示倒计时的程序,显示在一个文本框或者label里

请问我应该写在哪里,大致代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Diagnostics;

namespace pigTime
{
public partial class Form1 : Form
{
//委托
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会在你截取之前获得键盘。
HookProc KeyBoardHookProcedure;
//快捷按键1设定存储
public static string qkey1 = "";
//快捷按键2设定存储
public static string qkey2 = "";
//猪圈国家点
public static int currCity = 0;
//刷新点名称
public static string currPoint = "";
//设定时间间隔
public static int tmjg = 0;
//设定误差时间
public static int wctm = 0;
private static int hour, minute, second, millsecond;
//键盘Hook结构函数
[StructLayout(LayoutKind.Sequential)]
public class KeyBoardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
#region DllImport
//设置钩子
[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);

#endregion
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
// TODO: 这行代码将数据加载到表“dbDataSet.TimeData”中。您可以根据需要移动或移除它。
this.timeDataTableAdapter.Fill(this.dbDataSet.TimeData);
// TODO: 这行代码将数据加载到表“dbDataSet.itemData”中。您可以根据需要移动或移除它。
this.itemDataTableAdapter.Fill(this.dbDataSet.itemData);
this.smallItemDataTableAdapter.Fill(this.dbDataSet.SmallItemData);
comboBox1.SelectedIndex = 6;

int sitemid = int.Parse(comboBox1.SelectedValue.ToString());
currCity = sitemid;
DataRowCollection drc = this.smallItemDataTableAdapter.GetDataBy(sitemid).Rows;
label4.Text = drc[0][1].ToString();
label5.Text = drc[1][1].ToString();
label6.Text = drc[0][1].ToString();
label7.Text = drc[1][1].ToString();
textBox3.Text = drc[0]["Qkey"].ToString();
textBox4.Text = drc[1]["Qkey"].ToString();
qkey1 = drc[0]["Qkey"].ToString();
qkey2 = drc[1]["Qkey"].ToString();

tmjg = int.Parse(textBox1.Text.Trim().ToString());
wctm = int.Parse(textBox2.Text.Trim().ToString());

Hook_Start();

}




#region 自定义事件
public 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();
//throw new Exception("设置Hook失败!");
}
}
}

//取消钩子事件
public void Hook_Clear()
{
bool retKeyboard = true;
if (hHook != 0)
{
retKeyboard = UnhookWindowsHookEx(hHook);
hHook = 0;
}
//如果去掉钩子失败.
if (!retKeyboard) throw new Exception("UnhookWindowsHookEx failed.");
}

//这里可以添加自己想要的信息处理
public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
{
if (nCode >= 0)
{
KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
if (getHookProc(qkey1, kbh.vkCode, (int)Control.ModifierKeys))
{
MessageBox.Show("测试1!");//在这里执行timer1.Start()方法 无法让计时器显示,郁闷
timer1.Start();
return 1;
}
if (getHookProc(qkey2, kbh.vkCode, (int)Control.ModifierKeys))
{
MessageBox.Show("测试2!");
return 1;
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
#endregion

/// <summary>
/// 判断组合按键是否正确
/// </summary>
/// <param name="qk">快捷键设定</param>
/// <param name="vkc">监听到的按键</param>
/// <param name="modk">监听到的指示键</param>
/// <returns></returns>
public static bool getHookProc(string qk, int vkc, int modk)
{
//解析设定键
qk = qk.Trim();
string[] aqk = qk.Split('+');
string strvk = aqk[aqk.Length - 1].ToString();
int mkCount = 0;
if (aqk.Length > 1)
{
for (int i = 0; i < aqk.Length - 1; i++)
{
if (aqk[i].Trim() == "Ctrl")
{
mkCount = mkCount + (int)Keys.Control;
}
if (aqk[i].Trim() == "Alt")
{
mkCount = mkCount + (int)Keys.Alt;
}
if (aqk[i].Trim() == "Shift")
{
mkCount = mkCount + (int)Keys.Shift;
}
}
}
if (mkCount > 0)
{
if (vkc == System.Text.Encoding.ASCII.GetBytes(strvk)[0] && modk == mkCount)
{
return true;
}
}
else
{
if (vkc == System.Text.Encoding.ASCII.GetBytes(strvk)[0])
{
return true;
}
}
return false;
}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
Hook_Clear();
}

private void timer1_Tick(object sender, EventArgs e)
{

if (second == 0)
{
if (minute == 0)
{
if (hour == 0)
{
timer1.Stop();//时间到
return;
}
else
{
hour--;
minute = 59;
second = 59;
}
}
else
{
minute--;
second = 59;
}
}
else
{
second--;
}
lbTime.Text = hour.ToString() + ":" + minute.ToString() + ":" + second.ToString();
textBox6.Text = hour.ToString() + ":" + minute.ToString() + ":" + second.ToString();
}



}
}



请懂的帮我一下 实在不知道咋弄了!谢谢
...全文
197 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
澄仙 2012-06-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
去掉 static 就是了
[/Quote]

谢谢 好用了 对于静态方法还是不是太懂 呵呵 见笑了 马上给分结贴
__天涯寻梦 2012-06-05
  • 打赏
  • 举报
回复
public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
去掉 static 就是了
澄仙 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
写在public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
里面。
[/Quote]
请问怎么写才能让文本框内的倒计时的显示程序显示出来呢?
timer1是私有的
KeyBoardHookProc这个方法是静态的啊?我这块是菜鸟不懂 希望能给与详细解释 谢谢
devmiao 2012-06-05
  • 打赏
  • 举报
回复
写在public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
里面。
内容概要:本文详细阐述了基于OpenCLaw框架的Windows驱动开发技术在银行业安全键盘防护系统中的实际应用。通过构建内核级键盘输入保护机制,实现对键盘记录器、内存转储、API钩子等高级威胁的有效防御。系统采用分层过滤驱动架构,结合IRP拦截、DMA保护、安全通道加密和行为异常检测等核心技术,确保客户在银行柜台终端进行密码输入、U盾验证等敏感操作时的数据安全。文中提供了完整的驱动代码实例,涵盖驱动初始化、设备过滤、输入加密处理、防重放攻击及用户层通信等关键环节,并探讨了未来向可信执行环境、AI异常检测和量子安全加密演进的方向。; 适合人群:具备Windows驱动开发基础,熟悉WDM/WDF框架,从事金融安全、内核安全或系统级防护研发的技术人员(工作年限2年以上);信息安全领域研究人员及高校相关专业研究生。; 使用场景及目标:① 构建金融级终端输入防护系统,抵御键盘窃取类攻击;② 学习OpenCLaw框架在高安全要求场景下的工程实践方法;③ 掌握内核级数据加密、IRP拦截与重定向、防重放攻击等关键技术的设计与实现;④ 为符合PCI DSS、等保合规要求提供技术参考。; 阅读建议:此资源以真实金融安全场景为背景,强调代码实现与安全机制的深度融合。建议读者结合Windows驱动开发环境动手实践,重点理解加密流程、完成例程机制与安全状态管理的设计思路,并关注未来趋势中TEE与零信任架构的融合路径。

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧