思路:通过反汇编确定记事本的窗口过程地址,把它替换为我们自己的窗口过程地址,在自己窗口过程中先判断是否是自定义的消息,
是则执行相应的操作,不是则把流程转到记事本原来的窗口过程中进行处理。
添加的功能:转换大小写,加解密文本,统计字数。
源代码编译成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); } } }