dll 子類化 記事本 相應自己的功能

這樣就可以diy 別人軟件 只粘貼部分代碼

只是dll 沒有劫持 需要手動注入

對記事本菜單進行修改

void menushow()
{
    hWnd = FindWindow(NULL, "無標題 - 記事本");
     hedit = 
     FindWindowEx(hWnd,NULL,"Edit", "");
    HMENU hMenu = GetMenu(hWnd);

    RemoveMenu(hMenu, 0, MF_BYPOSITION);
    RemoveMenu(hMenu, 0, MF_BYPOSITION);
    RemoveMenu(hMenu, 0, MF_BYPOSITION);
    RemoveMenu(hMenu, 0, MF_BYPOSITION);
    RemoveMenu(hMenu, 0, MF_BYPOSITION);


    HMENU hPopupMenu = CreatePopupMenu();

    AppendMenu(hMenu, MF_POPUP, (int)hPopupMenu, "VIP隱藏工具");
    AppendMenu(hPopupMenu, MF_STRING, 100, "置頂");
    AppendMenu(hPopupMenu, MF_STRING, 101, "透明");
    AppendMenu(hPopupMenu, MF_STRING, 102, "設置字體");  
    AppendMenu(hPopupMenu, MF_STRING, 103, "設置顏色");
    AppendMenu(hPopupMenu, MF_STRING, 104, "獲取進程");
    ShowWindow(hWnd,SW_SHOW);
    UpdateWindow(hWnd);
}

子類化的地方 和回調函數

extern "C" _declspec (dllexport)
 void fun()
{
    OldWindwProc=GetWindowLong(hWnd, GWL_WNDPROC);
    SetWindowLong(hWnd,GWL_WNDPROC,(long)NewWndProc);
 }

回調函數

LRESULT NewWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{

case WM_COMMAND:
    {
        WORD wID = LOWORD(wParam);
        if (wID==100)
        {
       //窗口置頂
        SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE | SWP_DRAWFRAME | SWP_NOSIZE);
        }
        if (wID==101)
        {
        typedef BOOL (WINAPI *PFN_SETLAYEREDWINDOWATTRIBUTES)(HWND hWnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags);

        PFN_SETLAYEREDWINDOWATTRIBUTES SetLayeredWindowAttributes = NULL;
        HMODULE m_hUser32 = LoadLibrary("User32.dll");
        SetLayeredWindowAttributes = (PFN_SETLAYEREDWINDOWATTRIBUTES)GetProcAddress(m_hUser32, "SetLayeredWindowAttributes");

        SetWindowLong( hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE)| WS_EX_LAYERED);
        SetLayeredWindowAttributes( hWnd, 0, 125, 3);
        }
        //設置字體
        if (wID==102)
        {

            GetObject(GetStockObject(SYSTEM_FONT), sizeof(lf), &lf);
            chfont.lStructSize = sizeof(CHOOSEFONT);
            chfont.hwndOwner = hWnd;
            chfont.hDC = NULL;
            chfont.lpLogFont = &lf;
            chfont.iPointSize = 0;
            chfont.Flags = CF_INITTOLOGFONTSTRUCT | CF_EFFECTS | CF_SCREENFONTS ;
            chfont.rgbColors = 0;
            chfont.lCustData = 0;
            chfont.lpfnHook = NULL;
            chfont.lpTemplateName = NULL;
            chfont.hInstance = NULL;
            chfont.lpszStyle = NULL;
            chfont.nFontType = 0;
            chfont.nSizeMin = 0;
            chfont.nSizeMax = 0;
            ChooseFont(&chfont);

            //創建字體
            hFont = CreateFontIndirect(&lf); 

            crText=chfont.rgbColors;

            SendMessage(hedit,WM_SETFONT,(WPARAM)hFont,0);

          InvalidateRect(hedit,NULL,TRUE); 

        }
        if (wID==103)
        {
            cc.lStructSize      =sizeof(cc);    
            cc.hwndOwner        =hedit;            
            cc.hInstance        =0;                     
            cc.rgbResult        =0;      
            cc.lpCustColors     =fontcolor;    
            cc.Flags            =CC_RGBINIT;    
            cc.lCustData        =0;            
            cc.lpfnHook         =0;            
            cc.lpTemplateName   =0;             

            if(ChooseColor(&cc)==TRUE)
            {
                DeleteObject(hb);             //刪除以前創建的,以免內存泄露
                clBkgnd=cc.rgbResult;               //保存背景色z
                InvalidateRect(hedit,NULL,TRUE);    //強制更新
            }


        }
        //獲取進程
        if (wID==104)
        {
            char  buf[MAXBYTE] ={0};
            char  pidbuf[MAXBYTE*10]={0};

            HANDLE hSnapshot =CreateToolhelp32Snapshot(
                TH32CS_SNAPPROCESS,
                0);
            PROCESSENTRY32 Process = {0};
            Process.dwSize = sizeof(PROCESSENTRY32);
            BOOL bRet = Process32First(hSnapshot, &Process);
             do 
             {
                 wsprintf(buf,"%s\r\n",Process.szExeFile);

                 strcat(pidbuf,buf);
             } 
             while (bRet =Process32Next(hSnapshot, &Process));
                 SetWindowText(hedit,pidbuf);
            }
        break;


    }
    break;

case WM_CTLCOLOREDIT:
{
SetTextColor((HDC)wParam,crText); //設置文字色
SetBkColor((HDC)wParam,clBkgnd); //設置背景色

    return (LRESULT)hb;  
   }
   break;

case WM_CLOSE:

    {
        MessageBox(NULL, "確認是否退出本程序", "提示",MB_ICONINFORMATION);

    }
break;

}
return (CallWindowProc((WNDPROC)OldWindwProc,hWnd,message,wParam,lParam ));//這裏一定要注意 

}

代碼很粗糙 需要更練習 ,需要源碼聯繫我 [email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章