0

我在 MyClass 中有这个静态回调函数,我尝试从中调用另一个静态函数。但是有一个问题,Register() 采用的参数之一是非静态类变量。

我想过使用“this”关键字来解决这个问题,但似乎我无法做到(“this”:只能在非静态成员函数中引用)。这是我的代码:

class MyClass
{
...
    static LRESULT CALLBACK klHkProc(int nCode, WPARAM wParam, LPARAM lParam);
    static BOOL Register(DWORD vKey,KEYBLOCK* ptrKEYBLOCK);
    KEYBLOCK *kb;       
...

}
LRESULT CALLBACK MyClass::klHkProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam);
    if (wParam == WM_KEYDOWN) 
    {
        MyClass::Register(p->vkCode,this->kb);
    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

有什么建议么?

4

3 回答 3

1

鉴于您写的内容,如果没有更多信息,很难回答这个问题。

但是,假设MyClass应该处理的所有实例,我建议添加一个static std::list<MyClass *>,您将每个实例的this指针放在构造函数中MyClass,然后在析构函数中从这个列表MyClass中删除。this

然后在您的静态 klHkProc() 中,您将遍历所有实例的静态列表,MyClass并为每个调用MyClass::Register()kb每个此类注册实例的MyClass.

这是执行此操作的代码的粗略轮廓:

class MyClass
{
...
public:
    static LRESULT CALLBACK klHkProc(int nCode, WPARAM wParam, LPARAM lParam);
    static BOOL Register(DWORD vKey,KEYBLOCK* ptrKEYBLOCK);
    static std::list<MyClass *> allInstances;
    KEYBLOCK *kb;

    MyClass() {
      ...
      allInstances.push_back(this);
      ...
    }
    ~MyClass() {
      ...
      // Assumes not a huge list of instances as this is O(n) and thus destruction
      // of all instances of MyClass in O(n^2) on the number of instances.
      allInstances.remove(this);
      ...
    }

...
};

LRESULT CALLBACK MyClass::klHkProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam);
    if (wParam == WM_KEYDOWN)
    {
        std::list<MyClass *> itr = allInstances.begin();
        std::list<MyClass *> end = allInstances.end();
        for (; itr != end; ++itr) {
          MyClass *current = *itr;
          MyClass::Register(p->vkCode, current->kb);
        }
    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}
于 2012-04-05T16:13:44.253 回答
0

静态成员和任何特定对象实例之间没有隐式连接。

MyClass您可以将对象的指针或引用传递给klHkProc(),然后它可以传递给Register()

于 2012-04-05T16:13:53.347 回答
0

一般来说,如果 KEYBLOCK *kb 不是静态的,则不能在静态函数中引用它。'this' 指针仅在对象实例中才有意义。因此,如果 KEYBLOCK *kb 仅在实例化对象中有意义,那么您将必须在 Register 或 klHkProc 中实例化 MyClass。如果您为我们提供了关于 Register 应该做什么的更好的上下文,而不仅仅是显示调用者,那么确定后者在 Register 中实例化 MyClass 是否有意义会更容易。

于 2012-04-05T16:16:08.993 回答