Fensterhandle von IE,Mozilla,etc



  • Hallo,

    mir ist grad eine Idee gekommen als ich so am Arbeiten war. Da ich viel fürs Internet schreibe, teste ich meine fertigen Seiten gerne bei verschiedenen Auflösungen um die Darstellung zu kontrollieren. Nun finde ich es sehr mühsam jedesmal den Browser mit einem Bildschirmlineal auf eine bestimmte Größe zu bringen. Da hab ich mir gedacht das es recht hilfreich wäre, das Fenstermenü der installierten Browser mit einer Funktion zu erweitern, die eine Größenänderung des Fensters realisiert. Soweit so gut. Mein Problem bei der Sache ist nun, die Fensterhandle genau dieser Fenster zu erhalten. Ich wollte eigentlich nicht mit einem Timer in bestimmten Intervallen prüfen, ob und wieviele Browserfenster geöffnet sind. Gibt es irgendwelche Messages die man abfangen kann um die Fenster zu ermitteln oder hat vielleicht jemand eine Idee wie sich das realisieren ließe?

    Mfg

    MORL



  • Im Folgenden mal ein Beispiel von mir. Ich Starte aus einer Anwendung heraus mit CreateProcess andere Progis und merke mir die Prozess-ID. Die von Mozilla usw. rauszufinden ist ja nicht so schwehr.

    Anhand der ProzessId identifiziere ich dann die Fenster und hole mir das Fensterhandle dazu.

    HWND hwndFromCallBack;
    
    BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
    {
         WINDOWPLACEMENT wp;
         char Caption[255];
         hwndFromCallBack = 0;
    
         if (!GetWindow(hwnd, GW_OWNER) && IsWindowVisible(hwnd))
         {
            GetWindowText(hwnd, Caption, 255);
            GetWindowPlacement(hwnd, &wp);
    
            if (wp.showCmd != SW_HIDE && strcmp("", Caption) != 0)
            {
               DWORD dwID;
               GetWindowThreadProcessId(hwnd, &dwID);
               if (dwID == (DWORD)lParam)
               {
                  hwndFromCallBack=hwnd;
                  return false;
               }
            }
         }
    
         return true;
    }
    
    void __fastcall TfrmMain::btnStartClick(TObject *Sender)
    {
       HWND HandleWindow = NULL;
    
       EnumWindows((WNDENUMPROC)EnumWindowsProc, dwProzessID);
       HandleWindow = hwndFromCallBack;
    
       if (HandleWindow != NULL)
       {
          //Test
          BringWindowToTop(HandleWindow);
       }
    }
    


  • @F98: Danke schonmal, aber mein Problem liegt eher noch woanders.

    Ich möchte es irgendwie erreichen, das mein Programm benachrichtigt wird, sobald ein neues Browserfenster geöffnet wird. Dies wollte ich eigentlich nicht durch ständiges "nachsehen" in einer Timer-Funktion machen. Ich dachte es gibt vielleicht irgendwelche Messages die Windows sendet, wenn ein neues Fenster erstellt wird. Diese Nachricht wollte ich abfangen und nachprüfen, ob das neu geöffnete Fenster ein Browserfenster ist oder nicht. Wenn ja dann soll das Fenstermenü erweitert werden, wenn nicht dann nicht. Wär natürlich toll wenn eine solche Message existieren würde. Falls das nicht der Fall ist wäre ich für Anregungen dankbar, die alternative Lösungen bieten.



  • Ich denke mal das mit den Messages wird nichts, weil es solche Messages glaube ich nicht gibt. da wirst Du nur über einen Timer alle Fenster durchrödeln müssen und nachschauen, was neu dazugekommen ist, und dann die Fenstercaptions auf Mozilla usw. testen müssen ...



  • Ich hab jetzt eine Lösung gefunden. Hab WH_GETMESSAGE und WH_CALLWNDPROC gehookt und so eine Abprüfung ohne Timer realisiert. Funktioniert alles wunderbar.



  • Code?



  • Kommt sofort :).

    hookDLL.cpp

    //---------------------------------------------------------------------------
    #include <windows.h>
    #pragma hdrstop
    //---------------------------------------------------------------------------
    extern "C" __declspec(dllexport) void SetHook(HWND);
    extern "C" __declspec(dllexport) void RemoveHook(void);
    LRESULT CALLBACK BrowserHookProc(int nCode, WPARAM wParam, LPARAM lParam);
    LRESULT CALLBACK BrowserMenuHookProc(int nCode, WPARAM wParam, LPARAM lParam);
    //---------------------------------------------------------------------------
    HHOOK ghHook = NULL;
    HHOOK ghHook2 = NULL;
    HINSTANCE ghInst;
    //---------------------------------------------------------------------------
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
            ghInst = hinst;
            return 1;
    }
    //---------------------------------------------------------------------------
    void SetHook(HWND hWnd)
    {
            if(!ghHook)
            {
                    ghHook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)BrowserHookProc, ghInst, 0);
                    if(!ghHook)
                    {
                            MessageBox(NULL,"Hook kann nicht erstellt werden", "FEHLER", MB_OK | MB_ICONERROR);
                    }
            }
            else
            {
                    MessageBox(NULL, "Hook ist bereits erstellt", "Browser Window Hook", MB_OK);
            }
    
            if(!ghHook2)
            {
                    ghHook2 = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)BrowserMenuHookProc, ghInst, 0);
                    if(!ghHook2)
                    {
                            MessageBox(NULL,"Hook2 kann nicht erstellt werden", "FEHLER", MB_OK | MB_ICONERROR);
                    }
            }
            else
            {
                    MessageBox(NULL, "Hook2 ist bereits erstellt", "Browser Window Hook", MB_OK);
            }
    }
    //---------------------------------------------------------------------------
    void RemoveHook(void)
    {
            UnhookWindowsHookEx(ghHook);
            UnhookWindowsHookEx(ghHook2);
    }
    //---------------------------------------------------------------------------
    LRESULT CALLBACK BrowserHookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
            if(nCode == HC_ACTION)
            {
                    CWPSTRUCT *cwp = (CWPSTRUCT*)lParam;
                    HWND hWndIE = FindWindow("IEFrame", NULL);
                    HWND hWndMozilla = FindWindow("MozillaWindowClass", NULL);
                    if((cwp->message == WM_CREATE) && ((cwp->hwnd == hWndIE) || cwp->hwnd == (hWndMozilla)))
                    {
                            HMENU hMenuIE = GetSystemMenu(cwp->hwnd, FALSE);
                            HMENU ddMenu = CreateMenu();
                            AppendMenu(ddMenu, MF_STRING, 101, "800 x 600");
                            AppendMenu(ddMenu, MF_STRING, 102, "1024 x 768");
                            AppendMenu(ddMenu, MF_STRING, 103, "1200 X 960");
                            AppendMenu(ddMenu, MF_STRING, 104, "1600 x 1200");
                            AppendMenu(ddMenu, MF_STRING, 105, "ganzer Bildschirm");
                            AppendMenu(hMenuIE, MF_SEPARATOR, 0, 0);
                            AppendMenu(hMenuIE, MF_POPUP, (UINT)ddMenu, "Größe anpassen");
                    }
            }
    
            return CallNextHookEx(ghHook, nCode, wParam, lParam);
    }
    //---------------------------------------------------------------------------
    LRESULT CALLBACK BrowserMenuHookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
            if(nCode == HC_ACTION)
            {
                    MSG *msg = (MSG*)lParam;
                    if(msg->message == WM_SYSCOMMAND)
                    {
                            RECT wRect;
                            GetWindowRect(msg->hwnd, &wRect);
                            switch(LOWORD(msg->wParam))
                            {
                                    case 101:       SetWindowPos(msg->hwnd, HWND_TOP, wRect.left, wRect.top, 800, 600, SWP_SHOWWINDOW);
                                                    break;
                                    case 102:       SetWindowPos(msg->hwnd, HWND_TOP, wRect.left, wRect.top, 1024, 768, SWP_SHOWWINDOW);
                                                    break;
                                    case 103:       SetWindowPos(msg->hwnd, HWND_TOP, wRect.left, wRect.top, 1200, 960, SWP_SHOWWINDOW);
                                                    break;
                                    case 104:       SetWindowPos(msg->hwnd, HWND_TOP, wRect.left, wRect.top, 1600, 1200, SWP_SHOWWINDOW);
                                                    break;
                                    case 105:       ShowWindow(msg->hwnd, SW_MAXIMIZE);
                                                    break;
                            }
                    }
            }
    
            return CallNextHookEx(ghHook, nCode, wParam, lParam);
    }
    

    Diese DLL wird von meinem Hauptprogramm dynamisch geladen und beim Erstellen des Hauptprogrammes werden die Hooks gesetzt. Beim Beenden des Programms werden diese dann wieder entfern. Es können natürlich ohne weiteres noch andere Browser oder Programme hinzugefügt werden.
    Was mir noch etwas schwer im Magen liegt ist, das die MSDN über Hooks sagt, das diese recht viel Resourcen schlucken. Aber ich glaube die Lösung mit den Hooks ist noch wesentlich performanter als die mit dem Timer.


Anmelden zum Antworten