c# 全局钩子问题

固执而又执着的人 2008-03-28 07:55:45
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace wa_hooktest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
internal enum HookType //枚举,钩子的类型
{

//MsgFilter = -1,

//JournalRecord = 0,

//JournalPlayback = 1,

Keyboard = 2,

//GetMessage = 3,

//CallWndProc = 4,

//CBT = 5,

//SysMsgFilter = 6,

//Mouse = 7,

//Hardware = 8,

//Debug = 9,

//Shell = 10,

//ForegroundIdle = 11,

//CallWndProcRet = 12,

KeyboardLL = 13,

//MouseLL = 14,

};

[DllImport("kernel32.dll")]
static extern int GetCurrentThreadId(); //取得当前线程编号的API

[DllImport("User32.dll")]
internal extern static void UnhookWindowsHookEx(IntPtr handle); //取消Hook的API


[DllImport("User32.dll")]
internal extern static IntPtr SetWindowsHookEx(int idHook, [MarshalAs(UnmanagedType.FunctionPtr)] HookProc lpfn, IntPtr hinstance, int threadID); //设置Hook的API


[DllImport("User32.dll")]
internal extern static IntPtr CallNextHookEx(IntPtr handle, int code, IntPtr wparam, IntPtr lparam); //取得下一个Hook的API
IntPtr _nextHookPtr; //记录Hook编号

public delegate IntPtr HookProc(int code, IntPtr wparam, IntPtr lparam);
public IntPtr MyHookProc(int code, IntPtr wparam, IntPtr lparam)
{
if (code < 0)
{
return CallNextHookEx(_nextHookPtr, code, wparam, lparam);
} //返回,让后面的程序处理该消息

if (wparam.ToInt32() == 98 || wparam.ToInt32() == 66)
{//如果用户输入的是 b

this.textBox1.Text = "a";
return (IntPtr)1; //直接返回了,该消息就处理结束了
}
else
{
return IntPtr.Zero; //返回,让后面的程序处理该消息
}



//if (wparam.ToInt32() == 91)
//{
// return (IntPtr)1;
//}
//else {
// return IntPtr.Zero;
//}
}

public void SetHook()
{

if (_nextHookPtr != IntPtr.Zero) //已经勾过了

return;
//线程钩子
HookProc myhookProc = new HookProc(MyHookProc); //声明一个自己的Hook实现函数的委托对象

//_nextHookPtr = SetWindowsHookEx((int)HookType.Keyboard, myhookProc, IntPtr.Zero, GetCurrentThreadId()); //加到Hook链中

//全局钩子
_nextHookPtr = SetWindowsHookEx((int)HookType.KeyboardLL, myhookProc, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0 ); //加到Hook链中

MessageBox.Show(_nextHookPtr.ToString());
}



public void UnHook()
{

if (_nextHookPtr != IntPtr.Zero)
{
UnhookWindowsHookEx(_nextHookPtr); //从Hook链中取消
_nextHookPtr = IntPtr.Zero;
}

}

private void Form1_Load(object sender, EventArgs e)
{
SetHook();
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
UnHook();
}
}
}
...全文
2979 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
duanlw 2012-09-19
  • 打赏
  • 举报
回复
看! 是一楼啊!真的是一楼啊!
看见彩虹 2012-09-09
  • 打赏
  • 举报
回复
我也看一楼。。为什么我复制了不行呢。
hou_kui 2012-07-23
  • 打赏
  • 举报
回复
恩,很好
ygy123zyz 2012-07-11
  • 打赏
  • 举报
回复
1111
shengzunhx 2012-07-05
  • 打赏
  • 举报
回复
为了看一楼。。。
灬菜 2012-06-07
  • 打赏
  • 举报
回复
來看看一樓
shmilyagony 2012-05-24
  • 打赏
  • 举报
回复
就想看看一楼到底写的神马东东
「已注销」 2012-03-07
  • 打赏
  • 举报
回复
学习一下
广州接入 2012-02-26
  • 打赏
  • 举报
回复
感谢1楼,搞定!
peiyingbo 2012-02-16
  • 打赏
  • 举报
回复
看一楼的。
LWZYJ 2011-12-01
  • 打赏
  • 举报
回复
niu!
lmlm36 2011-11-03
  • 打赏
  • 举报
回复
111
g554059868 2011-09-02
  • 打赏
  • 举报
回复
太感谢了,问题解决了,可是还有个问题是,怎么弄下是只要按下的消息了,现在这种写法好像会触发两次事件啊
icez 2011-08-20
  • 打赏
  • 举报
回复
这么一致,都看一楼?嘿嘿,看来不用去其他地方找了!啦啦~
liukeeq 2011-07-30
  • 打赏
  • 举报
回复
试过一楼的方案,解决了问题,谢谢
buildxu 2011-06-07
  • 打赏
  • 举报
回复
mark...........
wanglei198755 2011-06-01
  • 打赏
  • 举报
回复
看看一楼的
wanglei198755 2011-05-20
  • 打赏
  • 举报
回复
看一楼的
i_footprint 2011-05-13
  • 打赏
  • 举报
回复
看一楼
GlintFactory 2011-01-21
  • 打赏
  • 举报
回复
看一楼…………
加载更多回复(15)

110,583

社区成员

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

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

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