在使用 Spy++ 檢測基於對話框的 MFC 程式時,所有對話框的視窗類名均為 #32770 (Dialog)。這導致無法透過類名精準 FindWindow 定位特定對話框,僅能依賴視窗標題,但標題可能動態變更或重複,極不穩定。
核心思路:在對話框建立過程中,為其註冊一個唯一的窗口類名,使 FindWindow(lpszClassName, NULL) 能精準命中。
MyUniqueDialogClass)。

此法不依賴 IDE 介面,適合版本控管與自動化建構。
CWinApp::InitInstance 註冊新類BOOL CMyApp::InitInstance()
{
WNDCLASS wc;
// 取得預設對話框類 (#32770) 資訊
::GetClassInfo(AfxGetInstanceHandle(), _T("#32770"), &wc);
// 修改類名
wc.lpszClassName = _T("MyPrivateClassName");
// 重新註冊供 MFC 使用
AfxRegisterClass(&wc);
// ... 後續初始化
}
.rc 資源腳本指定類名用文字編輯器開啟 .rc 檔,在對話框定義處加入 CLASS "MyPrivateClassName":
IDD_MYDIALOG DIALOGEX 0, 0, 320, 200
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "我的對話框"
CLASS "MyPrivateClassName" // 關鍵行:必須與 InitInstance 中註冊的類名完全一致
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
// 控制項定義...
END

⚠ 致命陷阱:
.rc中的CLASS字串與InitInstance中wc.lpszClassName必須完全一致,否則程式啟動即失敗(無法建立視窗)。
重新編譯執行,用 Spy++ 檢視,該對話框的 Class Name 將顯示為 MyPrivateClassName。此時可精準執行:
HWND hWnd = FindWindow(_T("MyPrivateClassName"), NULL);
_ASSERT(hWnd != NULL); // 精準命中,不再受標題變更干擾
FindWindow 檢測是否已運行。MFC 預設為對話框共享 #32770 類名雖省事,卻犧牲了可識別性。透過「關閉 MFC Features → 編輯資源屬性」或「InitInstance 註冊 + .rc 指定」雙管齊下,即可賦予每個對話框專屬身份 ID,徹底解決 Spy++ 定位難題,為進階 Hook、自動化測試奠定堅實基礎。