C / C ++ - Windows - 如何跟踪HWND上下文数据

时间:2010-11-24 19:20:40

标签: c++ c windows

4 个答案:

答案 0 :(得分:4)

如果我正确理解你,你想避免一个窗口来捕捉来自另一个窗口的消息。避免这种情况的一种方法是使用 this 线程中提出的解决方案,该解决方案跟踪您创建的窗口,并确保正确的窗口获取与其关联的消息通过将调用者的指针存储在GWL_USERDATA中。

// ...
m_hWnd = CreateWindowEx(0,"Classname","Title",WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT,CW_USEDEFAULT,
                        320,200,NULL,NULL,hInstance, /*the magic pointer*/ this);

// ...

if(uMsg == WM_CREATE)
{
    // collected here..
    pParent = (CWindow*)((LPCREATESTRUCT)lParam)->lpCreateParams;
    // .. and then stored for later lookup
    SetWindowLongPtr(hWnd,GWL_USERDATA,(LONG_PTR)pParent); 
}
// ...

您还可以按Moo-Juice的建议捕获WM_NCCREATE消息。
而且我认为您不应该担心前面的消息WM_CREATE,因为此时窗口甚至没有完全初始化。如果您需要设置文字,请在致电CreateWindow(Ex)后进行设置,无论是用户输入还是SendMessage来电。

答案 1 :(得分:2)

创建窗口的人拥有该窗口100%。如果您是调用CreateWindow()的人,那么您可以使用GetWindowLong,因为它知道它是您的。

但是,如果某个库创建了窗口,则不能,因为它不属于您。

(旁白:没有什么可以阻止任何人踩到别人的脚趾,但是这个惯例非常标准。)

如果您使用的是执行此操作的库,则通常会有一些机制将您自己的数据与窗口相关联。当然,您需要参考相关文档。

答案 2 :(得分:1)

答案 3 :(得分:0)

你不能使用WNDCLASS.cbWndExtra声明你的类所需的私有存储,然后只要它创建该类的窗口,它就会被Windows分配。