答案 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分配。