我正在查看一些MFC/C++ CView对象子类,如下所示:
BOOL CCustomView::CreateView(DWORD dwStyle,
CDocument * pDocument,
CWnd * pParent,
String title)
{
...
CString className = AfxRegisterWndClass(CS_DBLCLKS,
::LoadCursor(NULL, IDC_IBEAM));
return Create(className, title, dwStyle,
rect, pParent, -1, &context);
}
我不喜欢这一点,尽管这对于MFC应用程序编程来说可能是正常的,因为运行时窗口类名不是我自己选择的名称。如果后来,我想从另一个Win32应用程序中找到这个窗口,并按窗口类名查找该窗口,我将不得不使用丑陋的"Afx:123:39843:39843“字符串,实际上,我不知道这些窗口类名是否可以保持不变。我宁愿将window类更改为"CCustomView",但仍然让它具有与上面创建的window类相同的行为。我该怎么做?
发布于 2012-09-16 16:47:41
有更好的方法来解决你的问题。我使用的典型协议是:
RegisterWindowMessage
注册窗口消息。消息名称应包含GUID,以使其在应用程序A中的PostMessage(HWND_BROADCAST, registeredMsg, idIWantToFindYou, HWNDofA)
若要将窗口句柄发布到所有顶级窗口,请执行以下操作。由于注册消息有多种用途,并且您应该限制注册消息的数量,因此请使用idIWantTofindYou
来区分您的消息的不同命令。
PostMessage(HWNDofA, registeredMessage, idHereIsMyHWnd, HWNDofB)
这种机制的优点是不会遇到没有响应的程序的问题。然而,“连接”不是直接的,所以你必须改变你的程序流程。或者,您可以使用EnumWindows
和SendMessageTimeout
来探测所有顶级窗口。
如果需要使用window类:
MFC分配的类名只是为了重用具有相同属性的窗口类。我不知道使用你自己的窗口类有什么问题。
因此,下面的代码应该可以工作:
DefWindowProc
填充WNDCLASS
或WNDCLASSEX
作为WNDPROC
(这就是MFC所做的,MFC的WNDPROC
是在创建窗口时设置的)AfxRegisterClass
或RegisterClass
注册窗口类。AfxRegisterClass
检查类是否已经注册,如果类是从动态链接库注册的,它将在卸载动态链接库时注销类。除此之外,它们大体相当。https://stackoverflow.com/questions/12444131
复制