思路:通过反汇编确定记事本的窗口过程地址,把它替换为我们自己的窗口过程地址,在自己窗口过程中先判断是否是自定义的消息,
是则执行相应的操作,不是则把流程转到记事本原来的窗口过程中进行处理。
添加的功能:转换大小写,加解密文本,统计字数。
源代码编译成DLL
// ExNotepad.cpp : Defines the entry point for the DLL application. // #include "stdafx.h" #include "resource.h" #include <tchar.h> #define IDR_UPPER (128)/*转换为大写*/ #define IDR_LOWER (129)/*转换为小写*/ #define IDR_ENCRYPT (130)/*加解密*/ #define IDR_COUNT (131)/*计算字数*/ HINSTANCE hDll; HWND g_hEdit = NULL; //编辑框句柄 DWORD ExWndProc(CONST DWORD Reserved, HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); VOID WINAPI TO_UPPER( HWND hWnd); //转换到大写 VOID WINAPI TO_LOWER( HWND hWnd); //转换到小写 VOID WINAPI EnCrypt( HWND hWnd); //简单加密 BOOL WINAPI EnCryptProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); VOID WINAPI OnEnCryptCommand( HWND hDlg, UINT uID, HWND hCtrl, UINT uNotifyCode); VOID WINAPI Count( HWND hWnd); //计算字数 BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { hDll = ( HINSTANCE )hModule; return TRUE; } DWORD ExWndProc(CONST DWORD Reserved, HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_COMMAND: { switch (LOWORD(wParam)) { case IDR_UPPER: { TO_UPPER(hWnd); } break ; case IDR_LOWER: { TO_LOWER(hWnd); } break ; case IDR_ENCRYPT: { EnCrypt(hWnd); } break ; case IDR_COUNT: { Count(hWnd); } break ; } } break ; } return 0; } VOID WINAPI TO_UPPER( HWND hWnd) { //读取编辑框句柄 if (g_hEdit = GetDlgItem(hWnd, 0xF)) { INT len = GetWindowTextLength(g_hEdit); if (len > 0) { LPTSTR pstrBuffer = new TCHAR [len+2]; memset (pstrBuffer, 0, sizeof ( TCHAR )*(len+2)); GetWindowText(g_hEdit, pstrBuffer, len+2); SendMessage(g_hEdit, EM_SETMODIFY, ( WPARAM )TRUE, 0); CharUpper(pstrBuffer); SetWindowText(g_hEdit, pstrBuffer); delete []pstrBuffer; } } } VOID WINAPI TO_LOWER( HWND hWnd) { //读取编辑框句柄 if (g_hEdit = GetDlgItem(hWnd, 0xF)) { INT len = GetWindowTextLength(g_hEdit); if (len > 0) { LPTSTR pstrBuffer = new TCHAR [len+2]; memset (pstrBuffer, 0, sizeof ( TCHAR )*(len+2)); GetWindowText(g_hEdit, pstrBuffer, len+2); SendMessage(g_hEdit, EM_SETMODIFY, ( WPARAM )TRUE, 0); CharLower(pstrBuffer); SetWindowText(g_hEdit, pstrBuffer); delete []pstrBuffer; } } } VOID WINAPI EnCrypt( HWND hWnd) { if (g_hEdit = GetDlgItem(hWnd, 0xF)) { INT len = GetWindowTextLength(g_hEdit); if (len > 0) { DialogBoxParam(hDll, MAKEINTRESOURCE(IDD_DLG_ENCRYPT), hWnd, EnCryptProc, NULL); } } } BOOL WINAPI EnCryptProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CLOSE: EndDialog(hDlg, 0); break ; case WM_COMMAND: { OnEnCryptCommand(hDlg, LOWORD(wParam), ( HWND )lParam, HIWORD(wParam)); } break ; default : return FALSE; } return TRUE; } VOID WINAPI OnEnCryptCommand( HWND hDlg, UINT uID, HWND hCtrl, UINT uNotifyCode) { switch (uID) { case IDC_BTN_ENCRYPT: //加密 { HWND hEncryptEdit = GetDlgItem(hDlg, IDC_EDT_KEY); INT nKeyLen = GetWindowTextLength(hEncryptEdit); if (nKeyLen > 0) { LPTSTR pstrKey = new TCHAR [nKeyLen+2]; memset (pstrKey, 0, nKeyLen+2); GetWindowText(hEncryptEdit, pstrKey, nKeyLen+2); INT len = GetWindowTextLength(g_hEdit); LPTSTR pstrText = new TCHAR [len+2]; memset (pstrText, 0, len+2); GetWindowText(g_hEdit, pstrText, len+2); SendMessage(g_hEdit, EM_SETMODIFY, ( WPARAM )TRUE, 0); DWORD dwKey = 0; for ( INT j = 0; j < nKeyLen; j++) { dwKey += pstrKey[j]; } dwKey %= 32; for ( INT i = 0; i < len; i++) { pstrText[i] -= ( TCHAR )dwKey; } SetWindowText(g_hEdit, pstrText); delete []pstrText; delete []pstrKey; } } break ; case IDC_BTN_DECRYPT: //解密 { HWND hEncryptEdit = GetDlgItem(hDlg, IDC_EDT_KEY); INT nKeyLen = GetWindowTextLength(hEncryptEdit); if (nKeyLen > 0) { LPTSTR pstrKey = new TCHAR [nKeyLen+2]; memset (pstrKey, 0, nKeyLen+2); GetWindowText(hEncryptEdit, pstrKey, nKeyLen+2); SendMessage(g_hEdit, EM_SETMODIFY, ( WPARAM )TRUE, 0); INT len = GetWindowTextLength(g_hEdit); LPTSTR pstrText = new TCHAR [len+2]; memset (pstrText, 0, len+2); GetWindowText(g_hEdit, pstrText, len+2); DWORD dwKey = 0; for ( INT j = 0; j < nKeyLen; j++) { dwKey += pstrKey[j]; } dwKey %= 32; for ( INT i = 0; i < len; i++) { pstrText[i] += ( TCHAR )dwKey; } SetWindowText(g_hEdit, pstrText); delete []pstrText; delete []pstrKey; } } break ; } return ; } VOID WINAPI Count( HWND hWnd) { if (g_hEdit = GetDlgItem(hWnd, 0xF)) { INT len = GetWindowTextLength(g_hEdit); if (len > 0) { TCHAR strText[MAX_PATH]; memset (strText, 0, sizeof ( TCHAR )*MAX_PATH); wsprintf(strText, _T( "当前总字数为: %d" ), len); MessageBox(hWnd, strText, _T( "字数统计" ), MB_OK); } } } |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞