思路:通过反汇编确定记事本的窗口过程地址,把它替换为我们自己的窗口过程地址,在自己窗口过程中先判断是否是自定义的消息,

是则执行相应的操作,不是则把流程转到记事本原来的窗口过程中进行处理。

添加的功能:转换大小写,加解密文本,统计字数。

源代码编译成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);
        }
    }
}

 

 

posted on   5t4rk  阅读(457)  评论(0编辑  收藏  举报
编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示