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

在Windows中,假设您有多个相同窗口类的窗口(HWND)打开。 如何跟踪窗口过程中的上下文数据,例如,当用户尝试键入窗口2时窗口1不会被修改?

在多次调用WndProc()之后,CreateWindow()不会返回,因此不能简单地将生成的HWND设置为上下文数据,并在WndProc()中进行查找。 你需要在WndProc()中设置它。

除了在窗口创build消息之外,WndProc()并不直接传递给它的上下文信息,但不幸的是窗口创build消息并不是传递给WndProc()的第一个消息。 不,我发现WM_SIZE,WM_NCSIZE等东西,甚至一些其他人都看到WM_CREATE之前传递。

将HWND存储在链表types的存储机制中对于大量的窗口来说效率不高:窗口中的每个控件只是另一种types的窗口,因此需要跟踪另一个HWND; 在几百个控件之后,在短时间内向程序传递几十条消息之后,searchHWND的链表将成为程序中的主要瓶颈!

据我所知,有些人使用SetWindowLong() – 但我也听说一些库也喜欢使用它来存储自己的上下文信息与程序分开,并且有时会发生窗口数据冲突。 这怎么可以避免?

Solutions Collecting From Web of "C / C ++ – Windows – 如何跟踪HWND上下文数据"

如果我正确地理解了你,你想要避开一个窗口来捕捉来自另一个窗口的消息。 避免这种情况的一种方法是使用线程中提出的解决方案, 解决方案跟踪由您创建的窗口,并确保正确的窗口通过将调用者的指针存储在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调用。

谁创造窗户谁拥有这个窗口100%。 如果你是调用CreateWindow()的人,那么你可以使用GetWindowLong,知道它是你的。

但是,如果一个图书馆创建了这个窗口,那么你不能这样做,因为这不是你的。

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

如果你正在使用这样的库,它通常会有一些机制将你自己的数据与一个窗口关联起来。 当然,你需要参考文档。

使用Windows属性: SetProp( HWND ,... )Getprop( HWND ,... )RemoveProp( HWND ,... )

您不能使用WNDCLASS.cbWndExtra来声明您的类需要的任何私有存储,然后它将在Windows创建该类的窗口时由Windows分配。