如何修改此基于MFC的代码段以使用我自己选择的窗口类名?

时间:2012-09-16 02:58:30

标签: c++ winapi visual-c++ mfc

我正在看一些像这样的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”字符串,实际上,我不知道知道是否可以指望那些窗口类名称不改变。我宁愿将窗口类更改为“CCustomView”,但仍然具有与上面创建的窗口类相同的行为。我该怎么做?

1 个答案:

答案 0 :(得分:3)

有更好的方法可以解决您的问题。我使用的典型协议是:

  • 在两个应用程序中使用RegisterWindowMessage注册窗口消息。消息名称应包含使其唯一的GUID
  • 在应用程序A中,使用
    PostMessage(HWND_BROADCAST, registeredMsg, idIWantToFindYou, HWNDofA)
    您的窗口句柄发布到所有顶级窗口。由于注册邮件的使用次数不止一次,您应该限制注册的邮件数量,使用idIWantTofindYou来区分邮件的不同命令。
  • 接收应用程序B现在具有发送者的窗口句柄,并且可以建立连接(例如通过
    PostMessage(HWNDofA, registeredMessage, idHereIsMyHWnd, HWNDofB)

这种机制的好处是没有遇到无响应程序的问题。但是,“连接”不是立即的,因此您必须更改程序流程。或者,您可以使用EnumWindowsSendMessageTimeout来探测所有顶级窗口。


如果您需要使用窗口类:

MFC分配的类名只会重新使用具有相同属性的窗口类。我不知道使用自己的窗口类有任何问题。

所以以下应该工作:

  • 使用所需属性填充WNDCLASSWNDCLASSEX
  • 使用DefWindowProc作为WNDPROC(这就是MFC所做的,创建窗口时MFC的WNDPROC已设置)
  • 使用AfxRegisterClassRegisterClass注册窗口类。 AfxRegisterClass检查该类是否已经注册,如果该类是从DLL注册的,它将在卸载DLL时取消注册该类。否则他们大致相当。