CallWindowProc Destroyed WM_PAINT



  • Ja Servus

    Sodele, bin gerade am Versuchen die "IEFrame" Callback zu erweitern, dass klappt auch alles.

    Nur es zerschneidet den IE beim ersten resize ein bisschen, obwohl ich nicht in der WM_PAINT message rumfummel... comisch, naja hier mal der code, könnt ihn mal ausprobieren werdet sehen was ich meine, vileicht sieht auch jemand eine fehler..

    FARPROC pIExplorer,pCArea;
    
    CWindow aWnd;
    WNDPROC pMshtml,pMyMshtml;
    HWND hIExplorer,hCArea,hMshtml;
    
    LRESULT CALLBACK mshtmlProc(HWND,UINT,WPARAM,LPARAM);
    LRESULT CALLBACK iExplorerProc(HWND,UINT,WPARAM,LPARAM);
    
    const char ccIExplorer[]="IEFrame";
    const char ccCArea[]="Shell DocObject View";
    const char ccMshtml[]="Internet Explorer_Server";
    
    const char ccIExplorerTitel[]="PlugIn Test - Microsoft Internet Explorer";
    
    int WINAPI DllEntryPoint(HINSTANCE hinst,unsigned long reason,void*)
    {
    
        if (reason==DLL_PROCESS_ATTACH)
        {
            hIExplorer=FindWindow(ccIExplorer,ccIExplorerTitel);
            hCArea=FindWindowEx(hIExplorer,0,ccCArea,0);
            hMshtml=FindWindowEx(hCArea,0,ccMshtml,0);
    
            pIExplorer=(FARPROC)SetWindowLong(hIExplorer,GWL_WNDPROC,(long)iExplorerProc);
            pMshtml=(WNDPROC)SetWindowLong(hMshtml,GWL_WNDPROC,(long)mshtmlProc);
    
            _Module.Init(ObjectMap,hinst);
            DisableThreadLibraryCalls(hinst);
        }
        return TRUE;
    }
    
    LRESULT CALLBACK mshtmlProc(HWND hwnd,UINT uint,WPARAM wparam,LPARAM lparam)
    {
        aWnd.Attach(hwnd);
        HDC hdc;
        RECT rect;
    
        switch(uint)
        {
            case WM_PAINT:
            {
                char text[14]="Hello IE World",windowText[100];
                AnsiString tmp1,tmp2;
                PAINTSTRUCT ps;
    
                GetWindowText(hIExplorer,&windowText[0],sizeof(ccIExplorerTitel));
                tmp1=windowText;
                tmp2=ccIExplorerTitel;
                if(tmp1==tmp2);
                else
                    {
                    pMyMshtml=(WNDPROC)SetWindowLong(hMshtml,GWL_WNDPROC,(long)pMshtml);
                    return 0;
                    }
    
                aWnd.GetClientRect(&rect);
                hdc=aWnd.BeginPaint(&ps);
    
                FillRect(hdc,&rect,(HBRUSH)(GetStockObject(GRAY_BRUSH)));
                DrawText(hdc,&text[0],sizeof(text),&rect,DT_TOP|DT_CENTER|DT_SINGLELINE|DT_VCENTER);
    
                aWnd.ReleaseDC(&hdc);
                return 0;
            }
        }
        return DefWindowProc(hwnd,uint,wparam,lparam);
    }
    
    //##############################################################################
    
    LRESULT CALLBACK iExplorerProc(HWND hwnd,UINT uint,WPARAM wparam,LPARAM lparam)
    {
        switch(uint)
        {
            case WM_SETTEXT:
            {
                String wndtext,plgtext;
    
                wndtext=(const char*)lparam;
                plgtext=ccIExplorerTitel;
    
                if(wndtext==plgtext)
                    if(pMyMshtml)
                        pMshtml=(WNDPROC)SetWindowLong(hMshtml,GWL_WNDPROC,(long)pMyMshtml);
            }
        }
        CallWindowProc(pIExplorer,hwnd,uint,wparam,lparam);
        return DefWindowProc(hwnd,uint,wparam,lparam);
    }
    

    Danke schon mal....



  • Ohne es jetzt getestet, das Problem erkannt oder genauer angesehen zu haben, meinst du nicht, die IE Callback ruft schon DefWindowProc auf?



  • DefWindowProc is falsch. du musst schon die alte wndproc aufrufen wenn deine neue die nachricht nicht verarbeitet.



  • ja schon klar....

    @kanzler
    Vor der DefWindowProc rufe ich die alte orginale auf...

    hey probierts bitte aus, denn wenn ich die DefWindowProc weg lasse, wobei ich euch recht gebe das dies logischer ist, funktioniert gar nix mehr (er nimmt nicht mal WM_CLOSE dann entgegen......

    los probierts aus ihr werdet sehen,

    für die, die nicht wissen wie:
    -html mit object tag erzeugen
    -clsid erzeugen und in dem object tag vermerken
    -clsid in der reg zur eben dieser dll linken


Anmelden zum Antworten