Ich versuche, eine 3rd Party App zu haken, so dass ich auf den Bildschirm zeichnen kann. Das Zeichnen auf den Bildschirm ist einfach und ich brauche keine Hilfe damit, aber ich habe Probleme mit der Verwendung von SetWindowsHookEx, um WH_GETMESSAGE zu behandeln. Ich kann nicht herausfinden, was ich für die letzten 2 Parameter weitergeben soll.SetWindowsHookEx in C#
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;
}
}
ich den Code oben modded widerzuspiegeln Ihre Idee: Ich bekomme immer noch SetWindowsHookEx (WH_GETMESSAGE, PaintHookProcedure, HMod, threadID) == 0; – Darthg8r
Es gibt die eindeutige Möglichkeit, dass Sie Ihre PaintHookProcedure in einer separaten DLL packen müssen; was die Verwendung von .NET ausschließt. Ergreifen Sie den Fehlermeldungscode mit GetLastError(), und sehen Sie, was das Problem ist. –
Und von GetLastError() meine ich Marshal.GetLastWin32Error(); p/Aufruf von GetLastError() direkt ist unzuverlässig. –