我刚刚设法在C ++中编写了一个全局CBT钩,可与C#一起使用。这听起来可能很愚蠢,但是由于我与C#的工作,我对指针和解释的知识非常糟糕。

我无法在LPARAM指向的结构内放置指针。

看起来像这样:LPARAM是通向CBT_CreateWnd结构的长指针,该指针又构成了成员的“ LPC”,也是造物演奏表的指针。该结构包含我想阅读的成员“ 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);

有人可以帮我吗?

有帮助吗?

解决方案

您的语法似乎已经退房,即使它可能有点不可读,并且 LPCREATESTRUCT 演员显然是不必要的。

您提到您获得了无效的值 x, , 也许 lParam 并不是真正的指针 CBT_CREATEWND 结构体?你在检查吗 nCode 回调功能等于 HCBT_CREATEWND 铸造之前 lParam?

其他提示

好吧,我真的不能说明您为什么获得无效的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 但是有更好的语法。

这也是一个建议,而此代码中的演员表似乎是合理的。总的来说,如果您发现自己正在投掷很多,那么您可能正在以艰难的方式或错误的方式进行操作。因此,请确保您花时间了解您所做的任何演员。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top