c#中的窗口挂钩

我试图从csharp连接到其他窗口。 我使用SetWindowsHookEx ,但没有运气转换它fom c ++ tc#。 我在这里找到了这个post,但它没有解决。 问题是SetWindowsHookEx返回0.它包括我发现的最佳代码samle:

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowDrawer { public partial class Form1 : Form { private delegate int HookProc(int code, IntPtr wParam, IntPtr lParam); static IntPtr hHook; IntPtr windowHandle; uint processHandle; HookProc PaintHookProcedure; [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)] static extern System.IntPtr FindWindowByCaption(int ZeroOnly, string lpWindowName); [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetWindowsHookEx", SetLastError = true)] static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId); [System.Runtime.InteropServices.DllImport("user32.dll")] static extern int CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); // When you don't want the ProcessId, use this overload and pass IntPtr.Zero for the second parameter [System.Runtime.InteropServices.DllImport("user32.dll")] static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); [System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet =System.Runtime.InteropServices.CharSet.Auto)] public static extern IntPtr GetModuleHandle(string lpModuleName); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { PaintHookProcedure = new HookProc(PaintHookProc); windowHandle = FindWindowByCaption(0, "Untitled - Notepad"); uint threadID = GetWindowThreadProcessId(windowHandle, out processHandle); IntPtr hMod = System.Runtime.InteropServices.Marshal.GetHINSTANCE(typeof(Form1).Module); // HERE IS THE PROBLEM. WHAT THE HECK DO I PASS INTO THE LAST 2 PARAMS? I get a null pointer hHook = SetWindowsHookEx(WH_GETMESSAGE, PaintHookProcedure, hMod, threadID); } public int PaintHookProc(int nCode, IntPtr wParam, IntPtr lParam) { // Do some painting here. return CallNextHookEx(hHook, nCode, wParam, lParam); } private const int WM_PAINT = 15; private const int WH_GETMESSAGE = 3; } } 

任何帮助,建议?

WH_GETMESSAGE钩子是一个全局钩子。 它需要一个可以注入另一个进程的DLL。 hMod参数。 有一个问题,你不能用托管语言编写这样的DLL。 目标进程不会初始化CLR。

有一个代码项目提供这样的DLL,也许你可以使它工作。 需要黑带。

你看过EasyHook项目了吗? 这似乎是一个非常活跃的项目。 微软也在他们的网站上有一个例子 。