C#-没有模块句柄?
我正在尝试制作一个程序,通过在WH_DEBUG上安装一个全局钩子,可以在我的系统上检测键盘记录器。我的问题是,GetModuleHandle(似乎还有所有其他更模糊的获取模块句柄的方法)返回null。我希望这里有人能透露一些情况 MainForm.cs:C#-没有模块句柄?,c#,hook,C#,Hook,我正在尝试制作一个程序,通过在WH_DEBUG上安装一个全局钩子,可以在我的系统上检测键盘记录器。我的问题是,GetModuleHandle(似乎还有所有其他更模糊的获取模块句柄的方法)返回null。我希望这里有人能透露一些情况 MainForm.cs: using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; using System.Runtime; us
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime;
using System.Diagnostics;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace MouseTimer
{
/// <summary>
/// Description of MainForm.
/// </summary>
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
public static void log(String ltxt)
{
((MainForm)Application.OpenForms[0]).richTextBox1.Text += ltxt+"\n";
((MainForm)Application.OpenForms[0]).richTextBox1.SelectionStart = ((MainForm)Application.OpenForms[0]).richTextBox1.Text.Length;
((MainForm)Application.OpenForms[0]).richTextBox1.ScrollToCaret();
}
public int DbgEvt(int code, IntPtr wParam, IntPtr lParam)
{
log("DBGEVT: "+wParam.ToString());
return 0;
}
void MainFormLoad(object sender, EventArgs e)
{
WindowsHook wh = new WindowsHook(HookType.WH_DEBUG, DbgEvt);
wh.Install();
}
}
}
使用系统;
使用System.Collections.Generic;
使用系统图;
使用System.Windows.Forms;
使用系统运行时;
使用系统诊断;
使用System.Runtime.InteropServices;
使用Microsoft.Win32;
命名空间鼠标器
{
///
///主窗体的描述。
///
公共部分类主窗体:窗体
{
公共表格(
{
初始化组件();
}
公共静态无效日志(字符串ltxt)
{
((MainForm)Application.OpenForms[0]).richTextBox1.Text+=ltxt+“\n”;
((MainForm)Application.OpenForms[0]).richTextBox1.SelectionStart=((MainForm)Application.OpenForms[0]).richTextBox1.Text.Length;
((MainForm)Application.OpenForms[0]).richTextBox1.scrolltocare();
}
公共int DbgEvt(int代码、IntPtr wParam、IntPtr lParam)
{
log(“DBGEVT:+wParam.ToString());
返回0;
}
void MainFormLoad(对象发送方,事件参数)
{
WindowsHook wh=新的WindowsHook(HookType.wh_DEBUG,DbgEvt);
wh.Install();
}
}
}
WindowsHook.cs:
public class WindowsHook
{
public delegate int HookProc(int code, IntPtr wParam, IntPtr lParam);
protected IntPtr m_hhook = IntPtr.Zero;
protected HookProc m_filterFunc = null;
protected HookType m_hookType;
public delegate void HookEventHandler(object sender, HookEventArgs e);
public event HookEventHandler HookInvoked;
protected void OnHookInvoked(HookEventArgs e)
{
if (HookInvoked != null)
HookInvoked(this, e);
}
public WindowsHook(HookType hook)
{
m_hookType = hook;
m_filterFunc = new HookProc(this.CoreHookProc);
}
public WindowsHook(HookType hook, HookProc func)
{
m_hookType = hook;
m_filterFunc = func;
}
protected int CoreHookProc(int code, IntPtr wParam, IntPtr lParam)
{
if (code < 0)
return CallNextHookEx(m_hhook, code, wParam, lParam);
HookEventArgs e = new HookEventArgs();
e.HookCode = code;
e.wParam = wParam;
e.lParam = lParam;
OnHookInvoked(e);
return CallNextHookEx(m_hhook, code, wParam, lParam);
}
public void Install()
{
using (Process p = Process.GetCurrentProcess())
using (ProcessModule m = p.MainModule)
{
m_hhook = SetWindowsHookEx(m_hookType, m_filterFunc,
GetModuleHandle(m.ModuleName), 0);
}
}
public void Uninstall()
{
UnhookWindowsHookEx(m_hhook);
m_hhook = IntPtr.Zero;
}
public bool IsInstalled
{
get{ return m_hhook != IntPtr.Zero; }
}
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
protected static extern IntPtr SetWindowsHookEx(HookType code,
HookProc func,
IntPtr hInstance,
int threadID);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
protected static extern int UnhookWindowsHookEx(IntPtr hhook);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
protected static extern int CallNextHookEx(IntPtr hhook,
int code, IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
}
公共类窗口钩子
{
公共委托int HookProc(int代码、IntPtr wParam、IntPtr lParam);
受保护的IntPtr m_hhook=IntPtr.Zero;
受保护的HookProc m_filterFunc=null;
受保护挂钩类型m_挂钩类型;
公共委托void HookEventHandler(对象发送方,HookEventArgs e);
公共事件HookEventHandler;
受保护的void OnHookInvoked(HookEventArgs e)
{
if(HookInvoked!=null)
(本,e);
}
公共窗钩(钩型钩)
{
m_hookType=吊钩;
m_filterFunc=新的HookProc(this.CoreHookProc);
}
公共窗口钩子(钩子类型钩子,钩子函数)
{
m_hookType=吊钩;
m_filterFunc=func;
}
受保护的int-CoreHookProc(int代码、IntPtr-wParam、IntPtr-lParam)
{
如果(代码<0)
返回CallNextHookEx(m_hhook,code,wParam,lParam);
HookEventArgs e=新的HookEventArgs();
e、 HookCode=代码;
e、 wParam=wParam;
e、 lParam=lParam;
关于(e);
返回CallNextHookEx(m_hhook,code,wParam,lParam);
}
public-void-Install()
{
使用(进程p=Process.GetCurrentProcess())
使用(ProcessModule m=p.MainModule)
{
m_hhook=setWindowshookx(m_hookType,m_filterFunc,
GetModuleHandle(m.ModuleName),0;
}
}
public-void卸载()
{
unhookwindowshookx(m_hhook);
m_hhook=IntPtr.Zero;
}
公共图书馆已安装
{
获取{return m_hhook!=IntPtr.Zero;}
}
[DllImport(“user32.dll”,CharSet=CharSet.Auto,SetLastError=true)]
受保护的静态外部IntPtr SetWindowsHookEx(挂钩类型代码,
HookProc func,
IntPtr hInstance,
int-threadID);
[DllImport(“user32.dll”,CharSet=CharSet.Auto,SetLastError=true)]
受保护的静态外部设备int unhookwindowshookx(IntPtr hhook);
[DllImport(“user32.dll”,CharSet=CharSet.Auto,SetLastError=true)]
受保护的静态外部int CALLNEXTHOKEX(IntPtr hhook,
int代码、IntPtr wParam、IntPtr lParam);
[DllImport(“kernel32.dll”,CharSet=CharSet.Auto,SetLastError=true)]
私有静态外部IntPtr GetModuleHandle(字符串lpModuleName);
}
问题是,当我尝试一个(低级)鼠标钩子时,它在没有模块句柄的情况下钩子很好。所以我不确定问题出在哪里。有人能帮忙吗
提前感谢,
Mike不支持.Net的全局钩子 请看这里: 我引述: 除了键盘和鼠标之外 如果是低级钩子,则无法在Microsoft中实现全局钩子 .NET框架。要安装全局钩子,钩子必须具有本机钩子 DLL导出以将自身注入另一个需要有效, 要调用的一致函数。此行为需要DLL导出。 .NET Framework不支持DLL导出。托管代码没有 函数指针的一致值的概念,因为 函数指针是动态构建的代理
使用工作鼠标挂钩时,您指的是普通鼠标挂钩还是“低级别”鼠标挂钩?低级钩子是完全不同的,而且它们也不会触发调试钩子。我建议只在C#中编写低级钩子。对于普通的钩子,使用像c这样的非托管语言。我说的是“低级”,为什么,有什么区别?低级钩子不需要模块句柄。它们是按原始流程运行的。全局非“低级”钩子将dll注入钩子触发的每个进程,它们需要句柄来确定要注入哪个dll。这意味着将CLR注入所有这些进程=>bad ideaAh,我可以看出这是多么糟糕。可能性能也会大幅下降。谢谢你澄清这一点。可以使用非托管包装,但即使如此,这仍然是个坏主意。哦,我明白了,好吧,谢谢你。虽然我无法理解为什么,但在我几个小时的谷歌搜索中,我还没有找到答案。但是谢谢你。这是有道理的。