win32 に次のコードがあり、ターゲット アプリケーションにフックを設定します。
void InstallHook(DWORD ThreadId)
{
g_hHook = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, g_hInstDll, ThreadId);
}
この関数を C# (.net) から呼び出したいと考えています。
私はこれまでのところこれを持っています:
[DllImport("TheHookDll.dll")]
public extern static void InstallHook(UInt32 ThreadId);
[DllImport("user32.dll")]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
そして私はそれを次のように呼びます:
IntPtr hWnd = FindWindow(null, "MyTargetAppWindowTitle");
UInt32 threadID = GetWindowThreadProcessId(hWnd, IntPtr.Zero);
InstallHook(threadID);
これにより、ターゲットのハンドル (hWnd) と、win32 の InstallHook 関数で使用されるスレッド ID が得られます。(16進数ではなく10進数です)
しかし、次のエラー メッセージが表示されます。
PInvokeStackImbalance が検出されました メッセージ: PInvoke 関数 'TheOperator!TheOperator.Form1::InstallHook' の呼び出しにより、スタックのバランスが崩れました。これは、マネージド PInvoke 署名がアンマネージド ターゲット シグネチャと一致しないことが原因である可能性があります。PInvoke シグネチャの呼び出し規約とパラメーターがターゲットのアンマネージド シグネチャと一致することを確認します。
dll ファイルの呼び出し規約 (構成プロパティ -> C/C++ -> すべてのオプション -> 呼び出し規約) を __cdel から __stdcall に変更しようとしましたが、うまくいきませんでした。(同じエラー)
私は何を間違っていますか?
C#はDWORDなどをサポートしていないため、DWORDをUInt32に変更しましたが、それは正しい方法ですか?
ヒントはありますか?