1

我正在查看一些 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”,但仍然具有与上面创建的窗口类相同的行为。我怎么做?

4

1 回答 1

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 时取消注册该类。否则它们大致相等。
于 2012-09-16T16:47:40.527 回答