gpt4 book ai didi

c# - SetWindowsHookEx 不适用于线程 ID

转载 作者:行者123 更新时间:2023-11-28 01:04:13 41 4
gpt4 key购买 nike

您好,在此先感谢所有愿意提供帮助的人。我正在尝试设置一个 CBT windows Hook ,当我在全局设置它时效果很好,但每当我尝试将它附加到单个线程时都会失败。据我所知,我按照这本书做每件事:- 我从非托管 dll 公开了 Hook 过程- 我的应用程序、dll 和线程的进程都是 32 位的- 我使用的线程ID是正确的(通过spy++确认)

当我试图从 C++ 代码中只 Hook 一个线程时,我设法做到了......你能只从非托管代码中 Hook 单个线程吗?

无论如何,这是我的代码:

[DllImport( "user32.dll", SetLastError = true )]
static extern IntPtr SetWindowsHookEx ( int hookType, UIntPtr lpfn, IntPtr hMod, uint dwThreadId );

[DllImport( "kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true )]
public static extern UIntPtr GetProcAddress ( IntPtr hModule, string procName );

[DllImport( "kernel32", SetLastError = true, CharSet = CharSet.Unicode )]
public static extern IntPtr LoadLibrary ( string libraryName );

const int WH_CBT = 5;

void SetHook ()
{
IntPtr dll = LoadLibrary( LIBRARY );
UIntPtr proc = GetProcAddress( dll, PROC );
uint threadId = GetAppWindowThreadId();
//assume that the threadId of the external window is correct, as I said I verified with spy++
//and assume that dll and proc both get correct values
IntPtr hookAddress = SetWindowsHookEx( WH_CBT , proc, dll, threadId );
//hookAddress is 0
}

最佳答案

[DllImport( "user32.dll", SetLastError = true )]
static extern IntPtr SetWindowsHookEx ( int hookType, UIntPtr lpfn,
IntPtr hMod, ulong dwThreadId );

该声明是错误的。最后一个参数 (dwThreadId) 的类型是 DWORD,C# 中的一个 uint。

很奇怪,您没有收到关于此的 PInvokeStackImbalance 调试器警告。这表明您正在运行 64 位操作系统。这增加了几种额外的故障模式,您注入(inject)的 DLL 必须包含编译为您的进程和您要 Hook 的进程的正确位数的非托管代码。根据需要设置项目的平台目标。您的代码缺少所有错误检查,因此您不知道为什么它不起作用,请务必在收到失败返回代码时抛出 new Win32Exception()。

关于c# - SetWindowsHookEx 不适用于线程 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7220541/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com