我在看Microsoft KB318804中的示例,但是它们使用“当前”应用程序的threadId!我有一些可以工作的C ++代码,但是我们必须重写它,而我更喜欢在那儿用C#重写。它要做的一件事是获取目标应用程序的threadId,如下所示:
uint lastId = GetWindowThreadProcessId(targetHandle, IntPtr.Zero);
不,GetCurrentThread不是正确的调用,因为我正在获取远程应用程序的线程ID,这是我们今天要做的以及我们想做的。 targetHandle是该远程应用程序的句柄。
我将此lastId强制转换为int并尝试连接C#代码,但SetWindowsHookEx返回0并失败。似乎只有AppDomain.GetCurrentThreadId()有效(即使已弃用,但替换也不起作用)。
那我是否必须使用C ++代码?还是有办法让它在C#中工作?
目前,我们在C ++中向其他应用程序注册了hookhandler并获取了事件。
最佳答案
您是否已签出pinvoke.net entry for SetWindowsHookEx
?
如果SetWindowsHookEx
返回NULL
,则应该调用GetLastError
,因此在C#中应调用Marshal.GetLastWin32Error
(假定P / Invoke签名中包含DllImportAttribute.SetLastError
)。
来自pinvoke.net:
签名
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetWindowsHookEx(HookType hookType, HookProc lpfn, IntPtr hMod, uint dwThreadId);
呼唤
IntPtr hHook;
using (Process process = Process.GetCurrentProcess())
using (ProcessModule module = process.MainModule)
{
IntPtr hModule = GetModuleHandle(module.ModuleName);
hHook = SetWindowsHookEx(HookType.WH_KEYBOARD_LL, hook, hModule, 0);
}
可能相关的问题:
PInvoke errors calling external SetWindowsHookEx and GetModuleHandle
关于c# - 如何将C++ SetWindowsHookEx移植到C#,或者这是不可能的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11302312/