0

なんとかc++でグローバルCBTフックを記述し、c#で使用できるようになりました。ばかげているように聞こえるかもしれませんが、c#を使用しているため、ポインターとそれらの逆参照に関する知識は非常に悪いです。

lParamが指す構造体内のポインターを逆参照できません。

次のようになります。lParamはCBT_CREATEWND構造体への長いポインタであり、CBT_CREATEWND構造体は、メンバー「lpcs」とCREATESTRUCTへのポインタを保持します。この構造体には、読みたいメンバー「x」が含まれています。次のことを試しましたが、xに無効な値が表示されます。

CREATESTRUCT str = *(LPCREATESTRUCT)(((LPCBT_CREATEWND)lParam)->lpcs);
int normal = str.x;
PostMessage(FindWindow(NULL, L"Process Watcher Window"), RegisterWindowMessage(L"ALEXX_SEINE_WNDMESSAGE_C"), wParam, normal);

誰か助けてくれませんか?

4

2 に答える 2

3

無効なx値を取得する理由の詳細についてはあまり話せませんが、このコードは別の方法で記述する可能性があります。

// the way you had it, it was making a copy of the CREATESTRUCT and storing it in str
// this just uses a pointer
LPCREATESTRUCT str = ((LPCBT_CREATEWND)lParam)->lpcs;
// when you have a pointer, use -> to use a member
int normal = str->x;

ポインタは初めてだとおっしゃっていたので->、少し説明します。あなたが書くときx->y、それは実際には同じです(*x).yが、より良い構文を持っています。

また、アドバイスのメモですが、このコードのキャストは妥当なようです。一般的に、あなたがたくさんキャストしていることに気付いた場合、あなたはおそらくそれを難し​​い方法か間違った方法のどちらかでやっています。ですから、あなたがしているキャストを理解するために時間をかけるようにしてください。

于 2011-01-18T18:11:29.160 に答える
1

おそらく少し読めないかもしれませんが、あなたの構文はチェックアウトしているようで、LPCREATESTRUCTキャストは明らかに不要です。

に対して無効な値を取得するとおっしゃいましたがx、おそらく実際には構造体lParamへのポインタではありませんか?キャストする前に、コールバック関数のが等しいCBT_CREATEWNDことを確認していますか?nCodeHCBT_CREATEWNDlParam

于 2011-01-18T18:13:16.367 に答える