#include "framework.h"
#include "17_SDK_sky.h"
//子类化(subclassing)一个编辑控件。通常子类化的时候,我们会用SetWindowLongPtr或者SetWindowLong来替换窗口过程
// 新的编辑框过程函数
WNDPROC g_pfnOldEdtProc = NULL;
LRESULT CALLBACK NewEditproc(HWND hwnd, UINT nMsg, WPARAM w, LPARAM l) {
if (nMsg == WM_CHAR) {
if (!isalnum(w)) {
return 0;
}
}
return g_pfnOldEdtProc(hwnd, nMsg, w, l);
}
// 对话框回调函数
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == BTN_SUBCLASS) {
// 替换文本框的过程函数
//g_pfnOldEdtProc 会保存旧的过程函数指针,SetWindowLongPtr赋值给 g_pfnOldEdtProc,使其不再为 NULL。
//g_pfnOldEdtProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(hDlg, EDT_SUBCLASS), GWL_WNDPROC, (LONG_PTR)NewEditproc);
g_pfnOldEdtProc = (WNDPROC)SetClassLong(GetDlgItem(hDlg, EDT_SUBCLASS), GWL_WNDPROC, (LONG_PTR)NewEditproc);//此处可以下断点模拟逆向调试
}
else if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) {
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
// 程序入口点
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow) {
return (int)DialogBox(hInstance, MAKEINTRESOURCE(IDD_ABOUTBOX), NULL, About);
}