2

我正在查看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 并获取事件。

4

2 回答 2

2

你检查过pinvoke.net 条目SetWindowsHookEx吗?

如果SetWindowsHookEx返回NULL,你应该调用GetLastError,所以在 C# 中你应该调用Marshal.GetLastWin32Error(假设它DllImportAttribute.SetLastError包含在 P/Invoke 签名中。)

来自 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);
}

可能相关的问题:

于 2012-07-02T23:04:33.083 回答
0

使用这个 kernel32 调用来获取当前线程 id:

    [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
    public static extern int GetCurrentThreadId();
于 2012-07-02T23:09:03.500 回答