按鈕的本質就是窗口
點擊查看代碼
void CreateButton(HWND hwnd)
{
HWND hwndPushButton;
HWND hwndCheckBox;
HWND hwndRadio;
hwndPushButton = CreateWindow (
TEXT("button"), //系統自帶的類
TEXT("普通按鈕"),
//WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_DEFPUSHBUTTON,
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_DEFPUSHBUTTON,
10, 10, //位置和大小
80, 20, //位置和大小
hwnd, //窗口句柄
(HMENU)1001, //子窗口ID -用來識別
hAppInstance, //句柄
NULL);
hwndCheckBox = CreateWindow (
TEXT("button"),
TEXT("複選框"),
//WS_CHILD | WS_VISIBLE | BS_CHECKBOX | BS_AUTOCHECKBOX,
WS_CHILD | WS_VISIBLE | BS_CHECKBOX |BS_AUTOCHECKBOX ,
10, 40,
80, 20,
hwnd,
(HMENU)1002, //子窗口ID
hAppInstance,
NULL);
hwndRadio = CreateWindow (
TEXT("button"),
TEXT("單選按鈕"),
//WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON | BS_AUTORADIOBUTTON,
WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON ,
10, 70,
80, 20,
hwnd,
(HMENU)1003, //子窗口ID
hAppInstance,
NULL);
}
![image](https://img2023.cnblogs.com/blog/3001071/202302/3001071-20230217213921302-1715905133.png)
按鈕的本質就是窗口
按鈕的WNDCLASS不是我們定義的,是系統預定義好的。如果我們想知道,系統預定義的WNDCLASS都包含什麼樣的信息
點擊查看代碼
TCHAR szBuffer[0x20];
GetClassName(hwndPushButton,szBuffer,0x20);
WNDCLASS wc;
GetClassInfo(hAppInstance,szBuffer,&wc);
OutputDebugStringF("-->%s\n",wc.lpszClassName);
OutputDebugStringF("-->%x\n",wc.lpfnWndProc);
逆向分析
1.找到入口
2.找到關鍵函數 定位信息循環
3.定位關鍵的按鈕