Programm lässt Menüs verschwinden



  • Hallo zusammen,

    ich hab ein kleines Programm geschrieben, welches mir beim Mozilla und beim IE im Fenstermenü einen zusätzlichen Menüpunkt hinzufügt. Ich habe dazu eine DLL geschrieben welche einen Hook startet. Das ganze funktioniert auch ganz gut nur muss ichirgendwo einen Fehler eingebaut haben den ich nicht finde. Folgendes Problem tritt auf:
    Wenn ich mein Programm gestartet habe verschwinden plötzlich mein Windows Startmenü und mein Schnellstart Menü. Es wird nur noch der Schatten des Menüs angezeigt und mehr nicht :(. Ich hab keine Ahnung warum.
    Ich poste am besten mal etwas Code und würde mich freuen wenn mal jemand drüber sehen könnte.

    Anwendung "main.cpp"

    //---------------------------------------------------------------------------
    #include <windows.h>
    #include "dllimp_unit.h"
    #pragma hdrstop
    //---------------------------------------------------------------------------
    #pragma argsused
    #define WM_SYSTRAY WM_USER + 102
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    static HICON hIcon;
    //---------------------------------------------------------------------------
    
    WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
            char szAppClass[] = "Moa2ApplicationClass";
            WNDCLASSEX wc;
    
            hIcon = LoadIcon(hInstance,"APPICON");
    
            wc.cbSize               = sizeof(WNDCLASSEX);
            wc.style                = CS_HREDRAW | CS_VREDRAW;
            wc.lpfnWndProc          = WndProc;
            wc.cbClsExtra           = 0;
            wc.cbWndExtra           = 0;
            wc.hInstance            = hInstance;
            wc.hIcon                = LoadIcon(hInstance,"APPICON");
            wc.hCursor              = LoadCursor(NULL,IDC_ARROW);
            wc.hbrBackground        = (HBRUSH)(COLOR_WINDOW+1);
            wc.lpszMenuName         = NULL;
            wc.lpszClassName        = szAppClass;
            wc.hIconSm              = LoadIcon(hInstance,"APPICON");
    
            RegisterClassEx(&wc);
    
            HWND hWnd = CreateWindowEx(WS_EX_APPWINDOW,
                                            szAppClass,
                                            "MAjustic",
                                            WS_OVERLAPPED,
                                            0,
                                            0,
                                            0,
                                            0,
                                            NULL,
                                            NULL,
                                            hInstance,
                                            NULL);
    
            ShowWindow(hWnd, SW_HIDE);
            UpdateWindow(hWnd);
    
            MSG msg;
            while(GetMessage(&msg, NULL, 0 , 0))
            {
                    TranslateMessage(&msg);
                    DispatchMessage(&msg);
            }
            return msg.wParam;
    }
    //---------------------------------------------------------------------------
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
            static NOTIFYICONDATA notifyIcon;
            int wmId;
    
            switch(message)
            {
                    case WM_CREATE:         notifyIcon.cbSize               = sizeof(NOTIFYICONDATA);
                                            notifyIcon.hWnd                 = hWnd;
                                            notifyIcon.uID                  = 0;
                                            notifyIcon.uFlags               = NIF_ICON | NIF_TIP | NIF_MESSAGE;
                                            notifyIcon.uCallbackMessage     = WM_SYSTRAY;
                                            notifyIcon.hIcon                = hIcon;
                                            lstrcpy(notifyIcon.szTip,"MAjustic (Moa2-Design)");
                                            Shell_NotifyIcon(NIM_ADD,&notifyIcon);
                                            SetHook(hWnd); //Hier wird nun der Hookgestartet
                                            return 0;
    
                    case WM_SYSTRAY:        HMENU hMenu;
                                            POINT ptCurPos;
                                            switch(lParam)
                                            {
                                                    case WM_RBUTTONDOWN:            hMenu = CreatePopupMenu();
                                                                                    AppendMenu(hMenu, MF_STRING, 0, "Über...");
                                                                                    AppendMenu(hMenu, MF_SEPARATOR,0,0);
                                                                                    AppendMenu(hMenu,MF_STRING,1,"Beenden");
    
                                                                                    POINT ptCurPos;
                                                                                    GetCursorPos(&ptCurPos);
                                                                                    TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_TOPALIGN, ptCurPos.x, ptCurPos.y, 0, hWnd, NULL);
                                                                                    PostMessage(hWnd, WM_NULL, 0, 0);
                                                                                    break;
                                            }
                                            return 0;
    
                    case WM_COMMAND:        wmId = LOWORD(wParam);
                                            switch(wmId)
                                            {
                                                    case 0:
                                                                    break;
                                                    case 1:         Shell_NotifyIcon(NIM_DELETE, &notifyIcon);
                                                                    SendMessage(hWnd, WM_CLOSE, 0, 0);
                                                                    break;
                                            }
                                            return 0;
    
                    case WM_PAINT:          return 0;
    
                    case WM_DESTROY:        RemoveHook();
                                            DestroyIcon(hIcon);
                                            PostQuitMessage(0);
                                            return 0;
            }
    
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    //---------------------------------------------------------------------------
    

    Unit welche mit der DLL kommuniziert "dllimp_unit.cpp"

    //---------------------------------------------------------------------------
    #pragma hdrstop
    #include "dllimp_unit.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    HINSTANCE hdll;
    //---------------------------------------------------------------------------
    void SetHook(HWND hWnd)
    {
            TSetHook* SetHook;
            SetHook = NULL;
    
            if(hdll == 0)
            {
                    hdll = LoadLibrary("hook.dll");
            }
            if(hdll != 0)
            {
                    SetHook = (TSetHook*)GetProcAddress(hdll,"_SetHook");
            }
            if(SetHook != NULL)
            {
                    SetHook(hWnd);
            }
    }
    //---------------------------------------------------------------------------
    void RemoveHook(void)
    {
            TRemoveHook* RemoveHook;
            RemoveHook = NULL;
    
            if(hdll == 0)
            {
                    hdll = LoadLibrary("hook.dll");
            }
            if(hdll != 0)
            {
                    RemoveHook = (TRemoveHook*)GetProcAddress(hdll,"_RemoveHook");
            }
            if(RemoveHook != NULL)
            {
                    RemoveHook();
            }
            FreeLibrary(hdll);
    }
    //---------------------------------------------------------------------------
    

    und nun noch die DLL "hook_unit.cpp"

    //---------------------------------------------------------------------------
    #include <windows.h>
    //---------------------------------------------------------------------------
    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;
    HMENU ddMenu = NULL;
    //---------------------------------------------------------------------------
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
            switch(reason)
            {
                    case DLL_PROCESS_ATTACH:        ghInst = hinst;
                                                    break;
            }
    
            return 1;
    }
    //---------------------------------------------------------------------------
    void SetHook(HWND hWnd)
    {
            if(!ghHook)
            {
                    //Hook um auf die Message WM-INITMENUPOPUP zu reagieren
                    ghHook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)BrowserHookProc, ghInst, NULL);
                    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)
            {
                    //Hook um auf die neu eingefügten Menüpunkte zu reagieren
                    ghHook2 = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)BrowserMenuHookProc, ghInst, NULL);
                    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;
                    //Handle des aktuellen Fensters
                    HWND hWndAppWin = (HWND)(cwp->hwnd);
                    //Fensterhandles der Browser
                    HWND hWndIE = FindWindow("IEFrame", 0);
                    HWND hWndMozilla = FindWindow("MozillaWindowClass", 0);
    
                    if(cwp->message == WM_INITMENUPOPUP)
                    {
                            HMENU hMenu = (HMENU)cwp->wParam;
                            if(IsMenu(hMenu) && (HIWORD(cwp->lParam) == TRUE) && (ddMenu != hMenu))
                            {
                                    if((hWndAppWin == hWndIE) || (hWndAppWin == hWndMozilla))
                                    {
                                            //Fenstermenü des aktuellen Fensters
                                            HMENU hMenuBrowser = GetSystemMenu(hWndAppWin, FALSE);
                                            //Das neue Menü erstellen
                                            ddMenu = CreateMenu();
                                            AppendMenu(ddMenu, MF_STRING, 8151, "800 x 600");
                                            AppendMenu(ddMenu, MF_STRING, 8152, "1024 x 768");
                                            AppendMenu(ddMenu, MF_STRING, 8153, "1200 X 960");
                                            AppendMenu(ddMenu, MF_STRING, 8154, "1600 x 1200");
                                            AppendMenu(ddMenu, MF_STRING, 8155, "ganzer Bildschirm");
    
                                            //Die neuen Menüpunkte einfügen
                                            AppendMenu(hMenuBrowser, MF_STRING | MF_SEPARATOR, 8156, "");
                                            AppendMenu(hMenuBrowser, MF_STRING | MF_POPUP, (UINT)ddMenu, "Größe anpassen");
                                    }
                            }
                    }
    
                    if(cwp->message == WM_MENUSELECT)
                    {
                            if((cwp->lParam == NULL) && (HIWORD(cwp->wParam) == 0xFFFF))
                            {
                                    //Die Menüpunkte nach dem bedienen des Fenstermenüs wieder entfernen
                                    RemoveMenu(GetSystemMenu(hWndAppWin, FALSE), 8156, MF_BYCOMMAND);
                                    RemoveMenu(GetSystemMenu(hWndAppWin, FALSE), (UINT)ddMenu, MF_BYCOMMAND);
                            }
                    }
            }
    
            return CallNextHookEx(ghHook, nCode, wParam, lParam);
    }
    //---------------------------------------------------------------------------
    LRESULT CALLBACK BrowserMenuHookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
            if(nCode == HC_ACTION)
            {
                    MSG *msg = (MSG*)lParam;
                    //Hier wird nun auf die enizelnen Menüpunkte reagiert
                    if(msg->message == WM_SYSCOMMAND)
                    {
                            RECT wRect;
                            GetWindowRect(msg->hwnd, &wRect);
    
                            switch(LOWORD(msg->wParam))
                            {
                                    case 8151:       SetWindowPos(msg->hwnd, HWND_TOP, wRect.left, wRect.top, 800, 600, SWP_SHOWWINDOW);
                                                    break;
                                    case 8152:       SetWindowPos(msg->hwnd, HWND_TOP, wRect.left, wRect.top, 1024, 768, SWP_SHOWWINDOW);
                                                    break;
                                    case 8153:       SetWindowPos(msg->hwnd, HWND_TOP, wRect.left, wRect.top, 1200, 960, SWP_SHOWWINDOW);
                                                    break;
                                    case 8154:       SetWindowPos(msg->hwnd, HWND_TOP, wRect.left, wRect.top, 1600, 1200, SWP_SHOWWINDOW);
                                                    break;
                                    case 8155:       ShowWindow(msg->hwnd, SW_MAXIMIZE);
                                                    break;
                            }
                    }
            }
    
            return CallNextHookEx(ghHook, nCode, wParam, lParam);
    }
    

    So das is nun der vollständige Code des Programmes. Wäre schön wenn einer Hilfe geben könnte.

    Mfg

    MORL



  • Suchst du nicht eher sowas: Adding Entries to the Standard Context Menu 😕



  • Nein eher nicht.
    Mein Programm soll einfach nur dazu dienen, das Browserfenster auf eine neue Größe zubringen. Ich finde das für die Webentwicklung ganz hilfreich da man sich seine Arbeiten ganz leicht bei 800x600 und anderen Fenstergrößen ansehen kann. Es soll ja auch nicht nur für den IE sein, sondern soll später einmal mehrere Browser unterstützen.
    Mal ganz davon abgesehen ob ich den richtigen Weg gegangen bin oder nicht, wüsste ich gerne ob, und wenn ja was, ich falsch gemacht habe.



  • Was mir auffällt, ist, dass du bei WM_MENUSELECT nicht mehr checkst, ob es ein Browser-Fenster ist...



  • JO danke für den Tipp. Das hatte ich gar nicht bedacht aber die Lösung des Problems war das trotzdem nicht. Hab aber den Fehler gefunden. Ich habe mit FindWindow versucht diejenigen Fenster zu finden, die die angegebenen Klassen haben. Das kann wohl bei mehreren offenen Fenstern zu Problemen führen. Ich hab jetzt mit GetClassName den Namen der KLasse des aktuellen Fensters ermittelt und führe dann einen Stringvergleich aus. So funktioniert das jetzt. Aber vielen Dank für deine Bemühungen.


Anmelden zum Antworten