c++ - 如何修改这个基于 MFC 的代码片段以使用我自己选择的窗口类名?

标签 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”,但它仍然具有与上面创建的窗口类相同的行为。我该怎么做?

最佳答案

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

  • 使用 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 时注销该类。否则它们大致相同。

关于c++ - 如何修改这个基于 MFC 的代码片段以使用我自己选择的窗口类名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12444131/

相关文章:

c++ - 在 vector 的 vector 中查找元素的位置

c++ - 有 break 语句时如何计算时间复杂度

c++ - 我如何将击键发送到一个程序?

windows - 如何在 NTFS 上创建稀疏文件?

.net - Visual Studio 2010 Beta 2 中的目标 .NET 3.5 C++/CLI

C++:自定义数据类型 - 类型转换和 union 问题

c++ - 第二次使用 strcat 后堆损坏

c - gethostbyname win32错误

c++ - 我的 Visual C++ 编译器编译了过时的源

opencv - VS2013 + Win7 中缺少 MSVCP140.dll