SDK子类化文本框

#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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值