C# 钩子问题

bojian43 2009-04-23 10:57:27
SetWindowsHookEx(int hookid, HookProc hook, IntPtr pd, int xcid);

这个API方法的第三个参数是程序实例句柄,是什么意思? 第四和是线程ID号,怎么样获得外部程序的线程ID号?

比如说,我只要给记事本挂钩子, 只让记事本不能输入东西,具体该怎么办呢. 给个例子

谢谢,越详细越好.
...全文
360 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ii009 2009-10-05
  • 打赏
  • 举报
回复
一点都不清楚
sjlianan 2009-04-26
  • 打赏
  • 举报
回复
qianqian
saisky 2009-04-26
  • 打赏
  • 举报
回复
查下相关文档 里面有例子的
ws_hgo 2009-04-26
  • 打赏
  • 举报
回复
论坛里面收
很多的
bojian43 2009-04-26
  • 打赏
  • 举报
回复
自己顶
bojian43 2009-04-23
  • 打赏
  • 举报
回复
HHOOK SetWindowsHookEx(
int idHook, // 钩子的类型,即它处理的消息类型
HOOKPROC lpfn, // 钩子子程的地址指针。如果dwThreadId参数为0
// 或是一个由别的进程创建的线程的标识,
// lpfn必须指向DLL中的钩子子程。
// 除此以外,lpfn可以指向当前进程的一段钩子子程代码。
// 钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数。
HINSTANCE hMod, // 应用程序实例的句柄。标识包含lpfn所指的子程的
DLL。
// 如果dwThreadId 标识当前进程创建的一个线程,
// 而且子程代码位于当前进程,hMod必须为NULL。
// 可以很简单的设定其为本应用程序的实例句柄。
DWORD dwThreadId // 与安装的钩子子程相关联的线程的标识符。
// 如果为0,钩子子程与所有的线程关联,即为全局钩子。
);



就是有这个问题,比如说我想给记事本挂钩子 参数HINSTANCE hMod和DWORD dwThreadId 该怎么传,传什么进去? 全局钩子dwThreadId为0,那么给记事本挂钩子记事本的线程ID怎么获得
麻子Mozart 2009-04-23
  • 打赏
  • 举报
回复
使用API函数SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中。 SetWindowsHookEx函数总是在Hook链的开头安装Hook子程。当指定类型的Hook监视的事件发生时,系统就调用与这个Hook关联的 Hook链的开头的Hook子程。每一个Hook链中的Hook子程都决定是否把这个事件传递到下一个Hook子程。Hook子程传递事件到下一个 Hook子程需要调用CallNextHookEx函数。
  HHOOK SetWindowsHookEx(
  int idHook, // 钩子的类型,即它处理的消息类型
  HOOKPROC lpfn, // 钩子子程的地址指针。如果dwThreadId参数为0
  // 或是一个由别的进程创建的线程的标识,
  // lpfn必须指向DLL中的钩子子程。
  // 除此以外,lpfn可以指向当前进程的一段钩子子程代码。
  // 钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数。
  HINSTANCE hMod, // 应用程序实例的句柄。标识包含lpfn所指的子程的
  DLL。
  // 如果dwThreadId 标识当前进程创建的一个线程,
  // 而且子程代码位于当前进程,hMod必须为NULL。
  // 可以很简单的设定其为本应用程序的实例句柄。
  DWORD dwThreadId // 与安装的钩子子程相关联的线程的标识符。
  // 如果为0,钩子子程与所有的线程关联,即为全局钩子。
  );
  函数成功则返回钩子子程的句柄,失败返回NULL。
  以上所说的钩子子程与线程相关联是指在一钩子链表中发给该线程的消息同时发送给钩子子程,且被钩子子程先处理。
  在钩子子程中调用得到控制权的钩子函数在完成对消息的处理后,如果想要该消息继续传递,那么它必须调用另外一个 SDK中的API函数CallNextHookEx来传递它,以执行钩子链表所指的下一个钩子子程。这个函数成功时返回钩子链中下一个钩子过程的返回值, 返回值的类型依赖于钩子的类型。这个函数的原型如下:
  LRESULT CallNextHookEx
  (
  HHOOK hhk;
  int nCode;
  WPARAM wParam;
  LPARAM lParam;
  );
ericzhangbo1982111 2009-04-23
  • 打赏
  • 举报
回复
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;
using System.IO;
using System.Text.RegularExpressions;

namespace WindowsApplication1
{
/// <summary>
/// Description of MainForm.
/// </summary>
public partial class Form4 : Form
{

//委托
[DllImport("user32.dll", EntryPoint = "GetMessage")]
public static extern int GetMessage(
out COPYDATASTRUCT lpMsg,
IntPtr hwnd,
int wMsgFilterMin,
int wMsgFilterMax
);

[DllImport("user32.dll", EntryPoint = "DispatchMessage")]
public static extern int DispatchMessage(
ref COPYDATASTRUCT lpMsg
);

[DllImport("user32.dll", EntryPoint = "TranslateMessage")]
public static extern int TranslateMessage(
ref COPYDATASTRUCT lpMsg
);

public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}

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;
//键盘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
#region 自定义事件
public void Hook_Start()
{

// 安装键盘钩子
if (hHook == 0)
{
KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);

//hHook = SetWindowsHookEx(2,
// KeyBoardHookProcedure,
// GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), GetCurrentThreadId());

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 (kbh.vkCode == (int)Keys.S && (int)Control.ModifierKeys == (int)Keys.Control) // 截获F8
//{
// MessageBox.Show("快捷键已拦截!不能保存!");
// return 1;

//}
//if (kbh.vkCode == (int)Keys.Delete
// && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt) //截获Ctrl+Alt+Y
//{

// MessageBox.Show("!DeleteDeleteDeleteDeleteDelete");
// return 1;
//}
//if (kbh.vkCode == (int)Keys.X)
//{
// MessageBox.Show("不能全部保存!");
// return 1;
//}




return 0;
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
#endregion

public Form4()
{

InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{


Hook_Start();
}

private void button2_Click(object sender, EventArgs e)
{

Hook_Clear();
}
const int WM_COPYDATA = 0x004A;
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case WM_COPYDATA:
COPYDATASTRUCT mystr = new COPYDATASTRUCT();
Type mytype = mystr.GetType();
mystr = (COPYDATASTRUCT)m.GetLParam(mytype);

break;
default:
base.DefWndProc(ref m);
break;

}

}



}
}
ericzhangbo1982111 2009-04-23
  • 打赏
  • 举报
回复
http://blog.csdn.net/hejinjiang/archive/2008/03/19/2197066.aspx
boywangliang 2009-04-23
  • 打赏
  • 举报
回复
钩子不懂
只能帮顶
螳螂86 2009-04-23
  • 打赏
  • 举报
回复

111,126

社区成员

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

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

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