Windows核心编程在创建Error Show对话框的时候,Main函数是这样写的:
HWND hwnd = FindWindow(TEXT("#32770"), TEXT("Error Show")); if (IsWindow(hwnd)) { // An instance is already running, activate it and send it the new # SendMessage(hwnd, ESM_POKECODEANDLOOKUP, _ttoi(pszCmdLine), 0); } else { DialogBoxParam(hinstExe, MAKEINTRESOURCE(IDD_ERRORSHOW), NULL, Dlg_Proc, _ttoi(pszCmdLine)); }
我不明白这个#32770到底是什么,上网找了资料。然后自己又做了小实验了,终于搞清楚了。
这个#32770是对话框的默认类名,新建一个MFC对话框,通过Spy ++看下新创建的对话框的类名.
可以看到类名是#32770(对话框),无论以创建几个都是这样.#32770是对话框的默认类名.
但是通过
HWND hwnd = FindWindow(TEXT("#32770"), TEXT("Error Show"));
这个函数FindWindow还需要指定窗口名字,但是如果窗口名字不固定或者在创建中才决定,这样
HWND hwnd = FindWindow(TEXT("#32770"), NULL);
这个函数就找不到窗口类了,现在要做的就是创建唯一类名的窗口类,创建唯一类的步骤:
在重载的CWinApp中InitInstance()函数中修改,
BOOL CMy32770App::InitInstance() { WNDCLASS wc; // Get the info for this class。 // #32770 is the default class name for dialogs boxes。 ::GetClassInfo(AfxGetInstanceHandle(), "#32770", &wc); // Change the name of the class。 wc.lpszClassName = "Hello"; // Register this class so that MFC can use it。 AfxRegisterClass(&wc); //.............. }
2.在资源中修改类名
IDD_MY32770_DIALOG DIALOGEX 0, 0, 320, 200 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_APPWINDOW CAPTION "Hello" CLASS "Hello" //这个地方是重点,这个CLASS和上面的初始化中名字必须相同 FONT 9, "宋体" BEGIN DEFPUSHBUTTON "确定",IDOK,260,7,50,14 PUSHBUTTON "取消",IDCANCEL,260,23,50,14 LTEXT "TODO: 在这里设置对话控制。",IDC_STATIC,51,152,200,8 CONTROL "List1",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_OWNERDRAWFIXED | LVS_OWNERDATA | WS_BORDER | WS_TABSTOP,23,15,194,108 END
然后编译运行,最后通过Spy++可以看到
类名已经更改.
可以参开下面的文章:
http://www.vckbase.com/index.php/wv/910.html