Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-没有模块句柄?_C#_Hook - Fatal编程技术网

C#-没有模块句柄?

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

我正在尝试制作一个程序,通过在WH_DEBUG上安装一个全局钩子,可以在我的系统上检测键盘记录器。我的问题是,GetModuleHandle(似乎还有所有其他更模糊的获取模块句柄的方法)返回null。我希望这里有人能透露一些情况

MainForm.cs:

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,我可以看出这是多么糟糕。可能性能也会大幅下降。谢谢你澄清这一点。可以使用非托管包装,但即使如此,这仍然是个坏主意。哦,我明白了,好吧,谢谢你。虽然我无法理解为什么,但在我几个小时的谷歌搜索中,我还没有找到答案。但是谢谢你。这是有道理的。