0

我刚刚设法用 c++ 编写了一个全局 CBT 挂钩,可用于 c#。这听起来可能很愚蠢,但由于我使用 c# 工作,我对指针和取消引用的了解非常糟糕。

我无法取消引用 lParam 指向的结构内的指针。

它看起来像这样:lParam 是一个指向 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结构的指针?您是否在强制转换之前检查nCode回调函数是否等于?HCBT_CREATEWNDlParam

于 2011-01-18T18:13:16.367 回答