题
我刚刚设法在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
但是有更好的语法。
这也是一个建议,而此代码中的演员表似乎是合理的。总的来说,如果您发现自己正在投掷很多,那么您可能正在以艰难的方式或错误的方式进行操作。因此,请确保您花时间了解您所做的任何演员。
不隶属于 StackOverflow