2

私はMicrosoftKB318804の例を見ていましたが、それらは「現在の」アプリケーションのthreadIdを使用しています!!! 動作するC++コードがいくつかありますが、それを書き直す必要があります。そこにいる間にC#で書き直したいと思います。それが行う1つのことは、次のようにターゲットアプリケーションのthreadIdを取得することです。

uint lastId = GetWindowThreadProcessId(targetHandle, IntPtr.Zero);

いいえ、GetCurrentThreadは正しい呼び出しではありません。これは、リモートアプリケーションのスレッドIDを取得しているためです。これは、今日行っていることであり、やりたいことです。targetHandleは、そのリモートアプリケーションへのハンドルです。

このlastIdをintにキャストし、C#コードを接続しようとしましたが、SetWindowsHookExは0を返し、失敗します。AppDomain.GetCurrentThreadId()のみが機能しているようです(非推奨ですが、置換も機能しません)。

それでは、C ++コードを使用する必要がありますか?または、C#で動作させる方法はありますか?

現在、C ++のフックハンドラーを他のアプリケーションに登録し、イベントを取得しています。

4

2 に答える 2

2

pinvoke.netエントリSetWindowsHookExをチェックアウトしましたか?

SetWindowsHookExが返された場合はNULL、を呼び出すことになっているGetLastErrorため、C#では呼び出す必要があります( P / Invoke署名に含まれているMarshal.GetLastWin32Errorと仮定します)。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);
}

おそらく関連する質問:

于 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 に答える