我在看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/

10-11 03:08