Newsticker schreiben



  • connan schrieb:

    Dafür bist Du ja hier der Experte 🙂

    Das ist nur ein Gerücht 😃

    connan schrieb:

    Interessiert mich aber wirklich sehr, denkst Du das Bsp mit dem Moueshook hilft mir da weiter (o. Skippy 😉 ), sollte eigentlich o.?

    Ja, zumindest für den Ansatz sollte der Mousehook dir helfen. Du musst natürlich auf eine andere Nachricht reagieren wie bei dem Mousehook, das ist aber klar.
    Hier stehen noch einige wichtige Einzelheiten drin.
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-92249.html
    Beispiel:

    HCBT_MINMAX Ein Window wurde minimiert bzw. maximiert



  • Danke Dir das werd ich doch dann gleich mal probieren...



  • connan schrieb:

    Danke Dir das werd ich doch dann gleich mal probieren...

    Sag bescheid wie es geklappt hat, würde mich interessieren.



  • ich würde sogar sagen das ist genau die Methode verwendet die Verwendet wird denn das sich das Fenster dann nicht auf den ganzen Bildschrim verteilt sondern erst ab den Fenster. funktioniert ja nur wenn man ein Fenster maximiert. zieht man es per maus in die läne legt es sich normal unter.

    danke Guenni81

    und connan ja sag bescheit obs klappt mich interessiert es auch 😉



  • Zwischenbericht:

    Also es funktioniert, zumindest für den aufrufenden Thread. Ich kann die Nachrichten abfangen und korrigieren, so kann man z.B. das Fenster gar nicht erst in den Bereich schieben den man überwacht 🙂 und Dank Ernsties Tutorial wars schnell gemacht. 😉

    Was jetzt noch fehlt, ist die Geschichte mit der dll 🙄 für einen globalen Hook.



  • @connan

    Super 😉 hoffentlich klappt des, ich habe zwar nicht wirklich verstanden warum man ne dll braucht aber zu den Fragen komm ich lieber wenn du es eschafft hast habe denn bestimmt nochmehr fragen dazu.



  • Ernsties Tutorial ist einfach Super und sehr ausführlich... 😃



  • Ich möchte nun alle 30minuten den rss feed einlesen.

    Wie kann man das am besten realisieren ? Also das downloaden und verabreiten der xml-tags



  • mit SetTimer kanns du einstellen um die alle 30 min zu downloaden.
    für XML datei brauchst du einen XML Parser.



  • Halli hallo, es scheint zu funktionieren, zumindest ein Verschieben von Fenstern in den Bereich ist nach Start des Hooks nicht mehr möglich. Es fehlen noch die Abfragen für Maximieren und ein paar Fälle die mir noch nicht eigefallen sind 😉
    ist aber alles machbar --> SOLVED 😉



  • @connan Super das klappt 🙂 Hoffe du meldest dich dann auch mit code, weil meine Fähigkeiten übersteigen Hooks leider noch bei weitem.

    @all also xml parser hab ich schon was gefunden die klasse die ich gefunden habe ist zwar ziehmlich Umfangreich aber das bekomm ich hin

    nur die html datei downloaden bzw xml datei hab ich noch nicht wirklich was gefunden.
    Gibts vielleicht ne MFC funktion dafür 🙄



  • Skippy84 schrieb:

    nur die html datei downloaden bzw xml datei hab ich noch nicht wirklich was gefunden.
    Gibts vielleicht ne MFC funktion dafür 🙄

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39117.html
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39100.html
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39123.html



  • So, ich versuchs mal, ganz so einfach wars dann allerdings doch nicht. Einiges hab ich noch nicht hinbekommen aber vieleicht fällt euch ja noch was dazu ein.
    Zuerst einmal die einfachste und schönste Variante, funktioniert aber leider nur für die WM_MOVE und WM_SIZE Nachrichten. Der Hook verhindert, das Fenster in einen Bereich kleiner 100 Pixel am oberen Bildschirmrand geschoben werden können.

    Ok, wir benötigen erst mal einen leeren Arbeitsbereich. In diesen Arbeitsbereich ein leeres Dll-Projekt einfügen, ich habs mal GHookDll, für GlobalHook, genannt.
    Als nächstes benötigen wir einen Header für die Dll und eine cpp Datei:

    //GHookDll.h
    
    #define HOOK_DLL_API __declspec(dllexport)
    
    HOOK_DLL_API void InstallHook( HWND hWwnd ); // Hook Installieren
    HOOK_DLL_API void RemoveHook();              // Hook Entfernen
    HOOK_DLL_API LRESULT CALLBACK HookProc( int nCode, WPARAM wParam, LPARAM lParam ); // Die HookFuntion
    
    //GHookDll.cpp
    #include "GHookDll.h"
    
    #pragma data_seg(".HOOKDATA") // Shared Data
    HHOOK hHook = NULL;
    HWND  hWnd  = NULL;
    #pragma data_seg()
    
    #pragma comment(linker, "/SECTION:.HOOKDATA,RWS")
    
    HINSTANCE hInstance = NULL;
    
    BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved )
    {
        switch (ul_reason_for_call)
        {
    	case DLL_PROCESS_ATTACH:
    	case DLL_THREAD_ATTACH:
    	case DLL_THREAD_DETACH:
    	case DLL_PROCESS_DETACH:
    	break;
        }
        hInstance = (HINSTANCE) hModule;
        hHook = NULL;
    
        return TRUE;
    }
    
    HOOK_DLL_API void InstallHook( HWND hWnd )
    {
        hHook = NULL;
        hWnd  = hWnd;
        hHook = SetWindowsHookEx( WH_CBT, HookProc, hInstance, NULL);
        if( hHook==NULL ) 
            MessageBox(NULL,"Unable to install hook","Error!",MB_OK);
    }
    
    HOOK_DLL_API void RemoveHook()
    {
        UnhookWindowsHookEx(hHook);
    }
    
    HOOK_DLL_API LRESULT CALLBACK HookProc( int nCode, WPARAM wParam, LPARAM lParam )
    {
        if(nCode == HCBT_MOVESIZE)
        {
            RECT& rc = *( (LPRECT) lParam );
            if( rc.top < 100 )
            {
                int iHeight = rc.bottom - rc.top;
    	    rc.top      = 100;
    	    rc.bottom   = iHeight + rc.top;
            }
        }
        return ( CallNextHookEx( hHook, nCode, wParam, lParam) ); //Nächsten Hook Aufrufen
    }
    

    Soviel zur Dll.

    Zum testen hab ich jetzt eine einfache Dialoganwendung im gleichen Arbeitsbereich erstellt und einen Button eingefügt.
    In der cpp - Datei des Dialogs:

    #include "GHookDll.h"
    

    In der Buttonbehandlungsroutine:

    InstallHook(this->GetSafeHwnd());
    

    Spätestens in OnDestroy():

    RemoveHook();
    

    Und das wars schon, nicht vergessen die .Lib zum Projekt zu linken.

    Leider lassen sich nicht Alle Windowsnachrichten so elegant bearbeiten, da sich für die meisten nur eine Art Readonly-Hook erstellen lässt bzw. in der Nachricht keine ausreichenden Informationen vorhanden sind. Z.B. lässt sich SW_MAXIMIZE so nicht behandeln, da das WindowRect kein Bestandteil der Nachricht ist. Um also zu Verhindern, das das Fenster über den ganzen Bildschirm maximiert wird fange ich die Nachricht ab (in HookProc 1L zurückgeben), vorher Sende ich eine User-Nachricht an meinen Dialog (wichtig, mit SendMessage). Der Maximiert jetzt das entsprechende Fenster um es danach entsprechend zu verkleinern. Wichtig ist an dieser Stelle, das der Hook deaktiviert wird, da man sonst beim maximieren in eine Endlosschleife rennt.
    Zusätzlich musst Du (Skippy 😉 ) noch auf SW_RESTORE reagieren. Bei mir tritt noch ein weiteres Problem auf, wenn ein maximiertes Fenster minimiert wird und durch klick auf die Taskleiste aktiviert wird, wird es wieder über den ganzen Bildschirm dargestellt 😕 . Es wird zwar eine WM_SYSCOMMAND Nachricht generiert aber dort fehlt mir das Windowshandle, naja vieleicht fällt mir ja nochwas dazu ein.

    Viele Grüße

    connan


Anmelden zum Antworten