Tôi đang cố gắng ghép ứng dụng của bên thứ 3 để tôi có thể vẽ lên màn hình của nó. Vẽ lên màn hình thật dễ dàng và tôi không cần trợ giúp với nó, nhưng dường như tôi đang gặp vấn đề với việc sử dụng SetWindowsHookEx để xử lý WH_GETMESSAGE. Tôi không thể tìm ra những gì để vượt qua cho 2 tham số cuối cùng.SetWindowsHookEx trong 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;
}
}
Tôi đã sửa đổi mã ở trên để phản ánh ý tưởng của bạn Tôi vẫn nhận được SetWindowsHookEx (WH_GETMESSAGE, PaintHookProcedure, hMod, threadID) == 0; – Darthg8r
Có khả năng khác biệt là bạn cần phải đóng gói PaintHookProcedure của bạn trong một DLL riêng biệt; ngăn cản việc sử dụng .NET. Lấy mã thông báo lỗi bằng GetLastError() và xem vấn đề là gì. –
Và bởi GetLastError() tôi có nghĩa là Marshal.GetLastWin32Error(); p/gọi trực tiếp GetLastError() là không đáng tin cậy. –