【问题标题】:Set dialog box window class name设置对话框窗口类名
【发布时间】:2016-04-02 19:25:03
【问题描述】:

对对话框进行子类化的正确方法是什么,以便其类名将更改为指定的类名,以便稍后使用 FindWindow(来自另一个进程)找到它?

class CMyDialog : public CDialogImpl<CMyDialog, CWindow> {
public:
    enum { IDD = IDD_MAIN };

    // error: CDialogImpl doesn't support GetWndClassInfo
    DECLARE_WND_CLASS(L"unique class name") 
};

【问题讨论】:

  • 您是否尝试通过指定的窗口名称获取对话框句柄?
  • @Mykola:“窗口名称”、窗口类或窗口标题是什么意思?如果是前者,那么我根本无法以这种方式设置唯一名称。如果是后者,那么问题是标题可以更改,或者我无法修改执行 FindWindow 搜索的应用程序。
  • 在任何情况下,类都不会像窗口标题(名称)那样唯一。
  • @Mykola:怎么样?该进程搜索一个唯一的 GUID 类名,保证不会与其他应用程序发生冲突,除非他们希望该进程找到他们的窗口。另一方面,窗口标题会根据多种因素而变化,例如应用程序名称、国际化、当前 UI 状态等...
  • 对话框有一个固定的类名,不能更改(无论如何都不会破坏任何东西)。如果您需要从另一个进程中识别您的窗口,您可以通过调用SetProp 将附加数据附加到它。为 lpString 指定 GUID 的字符串表示可以使进程唯一地标识一个窗口。

标签: c++ windows winapi atl wtl


【解决方案1】:

经过一些额外的搜索,我找到了How to provide your own Window class name for an MFC dialog box。虽然没有什么特定于 MFC 的。

总结:

  • CLASS "your class name" 字段添加到对话资源。可以在 GUI 中完成:在资源文件属性中禁用 MFC 模式,然后在对话框属性中显示类名属性。

  • WC_DIALOG 类的子类如下:

    WNDCLASSEXW wc;
    wc.cbSize = sizeof(WNDCLASSEX);
    ::GetClassInfoExW(0, WC_DIALOG, &wc);
    wc.lpszClassName = "your window class";
    wc.style &= ~CS_GLOBALCLASS;
    ::RegisterClassExW(&wc);
    

补充阅读:https://blogs.msdn.microsoft.com/oldnewthing/20100215-00/?p=14943/

【讨论】:

    猜你喜欢
    • 2016-09-08
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 2018-12-18
    • 1970-01-01
    • 2013-01-05
    • 2017-10-22
    相关资源
    最近更新 更多