Einzelne Steuerelemente auf Desktop



  • Original erstellt von D@niel $chumann:
    **@paranoiac.org: hast du das mal ausprobiert? printf und getchar in einer Windows-Anwendung? Das meinst du nicht ernst, oder?

    :D**

    [edit]Hab dein Post falsch verstanden, sorry[/edit]

    Danke!
    cu para
    😃

    [ Dieser Beitrag wurde am 08.01.2003 um 17:39 Uhr von paranoiac.org editiert. ]



  • Aber ausprobiert habe ich es natürlich. Es ging.
    Naja, was will man mehr? Ich wollte auch nur schnell was zum "testen".

    also, hoffentlich nicht so schlimm!

    cu para
    😃



  • Also, das Control wird erstellt, nur kann damit nichts anfangen. Mir scheint als müsste ich es in eine FensterProc einbauen, um damit was machen zu können.



  • Original erstellt von BiGFusel:
    Also, das Control wird erstellt, nur kann damit nichts anfangen. Mir scheint als müsste ich es in eine FensterProc einbauen, um damit was machen zu können.

    Stimmt. Ohne Messages ist nix mit was damit machen!

    cu para
    😃



  • Also trotz aller Versuche etwas Text hineinzuschreiben, funktioniert es auch in einer WndProc nicht. Unter Win98SE, wie ich es verwende, wird es gemalt, aber Eingaben kann ich nicht machen, es scheint als ob es abgestürzt ist. Ich versteh das nicht, denn das Desktop-Window ist doch in der Hinsicht ein Fenster wie jedes andere auch, in das ich Child-Windows einbauen kann, oder ?



  • Ich hab's jetzt mal probiert, hab WinXP:

    #include <windows.h>
    
    // ------------------------------------------------------------------------------------------- //
    
    const int EDIT_ID = 5000;
    
    const int TIMER_ID = 123321;
    
    // ------------------------------------------------------------------------------------------- //
    
    // Die WndProc
    LRESULT CALLBACK MainProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
    
    // ------------------------------------------------------------------------------------------- //
    
    HINSTANCE hInst; // Globaler Zugriffspunkt auf die Instanz
    
    // ------------------------------------------------------------------------------------------- //
    
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
    {
        hInst = hInstance;
    
        // Hauptfensterklasse registrieren
        WNDCLASSEX main;
        main.cbSize         = sizeof(main);
        main.cbClsExtra     = 0;
        main.cbWndExtra     = 0;
        main.hbrBackground  = (HBRUSH) GetStockObject(WHITE_BRUSH);
        main.hCursor        = LoadCursor(0,IDC_ARROW);
        main.hIcon          = LoadIcon(0,IDI_APPLICATION);
        main.hIconSm        = LoadIcon(0,IDI_APPLICATION);
        main.hInstance      = hInst;
        main.lpfnWndProc    = MainProc;
        main.lpszClassName  = TEXT("deskchild_class");
        main.lpszMenuName   = 0;
        main.style          = CS_VREDRAW | CS_HREDRAW;
        if(!RegisterClassEx(&main))
        {
            return 0;
        }
    
        // Hauptfenster erstellen
        HWND hMainWnd = CreateWindowEx(0,TEXT("deskchild_class"),TEXT("DeskChild"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,300,300,0,0,hInst,0);
        ShowWindow(hMainWnd,SW_HIDE);
        UpdateWindow(hMainWnd);
    
        // Hauptschleife
        MSG msgMain;
        while(GetMessage(&msgMain,0,0,0))
        {
            TranslateMessage(&msgMain);
            DispatchMessage(&msgMain);
        }
    
        return msgMain.wParam;
    }
    
    // ------------------------------------------------------------------------------------------- //
    
    LRESULT CALLBACK MainProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
        static HWND hDesktop;
        static HWND hEdit;
    
        switch(uMsg)
        {
    
        case WM_TIMER:
            {
                SYSTEMTIME st;
                TCHAR szBuf[256];
    
                GetLocalTime(&st);
                GetTimeFormat(LOCALE_USER_DEFAULT,0,&st,0,szBuf,(sizeof(szBuf) / sizeof(szBuf[0])));
    
                SendMessage(hEdit,WM_SETTEXT,0,(LPARAM) szBuf);
                return 0;
            } break;
    
        case WM_CREATE:
            {
                SetTimer(hWnd,TIMER_ID,1000,0);
    
                hDesktop = GetDesktopWindow();
    
                hEdit = CreateWindowEx(0,TEXT("edit"),0,WS_CHILD | WS_VISIBLE | ES_LEFT,5,5,100,16,hDesktop,(HMENU) EDIT_ID,hInst,0);
                return 0;
            } break;
    
        case WM_DESTROY:
            {
                KillTimer(hWnd,TIMER_ID);
                PostQuitMessage(0);
                return 0;
            } break;
    
        }
    
        return DefWindowProc(hWnd,uMsg,wParam,lParam);
    }
    

    Funktioniert super!

    cya 🙂



  • Is echt ne Möglichkeit, mit dem unsichtbaren Fenster, prima Idee...danke



  • Mir ist gar nix anderes eingefallen, als ein unsichtbares Fenster... wie krieg ich es sonst hin, dass es die ganze Zeit läuft?

    cya 🙂



  • Es gibt ja eine Reihe von Extra DesktopFunktionen der API aber da schien mir keine richtig zu passen !



  • Original erstellt von MagiC Creator:
    ... wie krieg ich es sonst hin, dass es die ganze Zeit läuft?

    Öhm, SubClassing und ne Message-Loop.



  • Kannste nicht mal nen Beispiel-Code posten ?



  • Denkste, ich setz mich jetzt daran für dich?! Ich hab auch noch andere Sachens zu tun!



  • 🙂



  • Na gut. Aber nur für dich. 😉

    #include <windows.h>
    //---------------------------------------------------------------------------
    
    // Global Variables
    HWND       g_hEdit;
    HWND       g_hParent;
    FARPROC    g_OldWndProc;
    //---------------------------------------------------------------------------
    
    // Function Prototypes
    HWND              FindListView32();
    LRESULT CALLBACK  NewWndProc(HWND, UINT, WPARAM, LPARAM);
    //---------------------------------------------------------------------------
    //---------------------------------------------------------------------------
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int)
    {
         g_hParent = FindListView32();
         if(!g_hParent)
            return -1;
    
         // Create Edit
         LONG style = WS_VISIBLE|WS_CHILD;
         LONG ex_style = WS_EX_CLIENTEDGE;
         g_hEdit = CreateWindowEx(ex_style, "EDIT", NULL, style,
                                  100, 400, 180, 21,
                                  g_hParent, NULL, hInstance, NULL);
         SendMessage(g_hEdit, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE, 0));
    
         // Subclass Edit
         g_OldWndProc = (FARPROC)GetWindowLong(g_hEdit, GWL_WNDPROC);
         SetWindowLong(g_hEdit, GWL_WNDPROC, (LONG)NewWndProc);
    
         // Message Loop
         MSG msg;
         while(GetMessage(&msg, NULL, 0, 0))
         {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
         }
         return msg.wParam;
    }
    //---------------------------------------------------------------------------
    
    LRESULT CALLBACK NewWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    {
       switch(iMsg)
       {
          case WM_KEYUP:
             if((int)wParam == VK_RETURN)
                SendMessage(g_hEdit, WM_CLOSE, 0, 0);
             break;
    
          case WM_DESTROY:
             PostQuitMessage(0);
             break;
       }
       return CallWindowProc(g_OldWndProc, hwnd, iMsg, wParam, lParam);
    }
    //---------------------------------------------------------------------------
    
    HWND FindListView32()
    {
         HWND hwnd = FindWindow(NULL, "Program Manager");
         if(hwnd)
         {
            hwnd = FindWindowEx(hwnd, NULL, "SHELLDLL_DefView", "");
            if(hwnd)
               hwnd = FindWindowEx(hwnd, NULL, "SysListView32", "");
         }
         return hwnd;
    }
    

    Müsste man sicher noch was dran rummodeln. Aber so in der Art halt.

    [ Dieser Beitrag wurde am 09.01.2003 um 01:37 Uhr von WebFritzi editiert. ]



  • Ich find meins sogar besser als MagiCs, da' erstens besser aussieht (;)) und man zweitens auch was reinschreiben kann. Ein dritter Punkt ist, dass das Edit nich vor allen Fenstern im Vordergrund steht. Und: Es hat keinen Button in der Taskleiste.



  • Deine Idee ist auch besser..., danke



  • Hallo,

    nochmal dieser lange Thread aber eine Frage noch, insbesondere an WebFritzi.
    Ich kann nach der Sub-Classing-Methode ja auch einen PUSHBUTTON auf das Desktop zaubern, nur weiss ich nicht wie und wo ich die WM_COMMAND-Messages von diesem abfange. Vielleicht mit PeekMessage ? Ick wees nich mer weider...



  • @WebFritzi: Bei mir kann man auch was reinschreiben und ein Button in der Taskleiste erscheint auch nicht!

    cya 🙂



  • Original erstellt von MagiC Creator:
    @WebFritzi: Bei mir kann man auch was reinschreiben und ein Button in der Taskleiste erscheint auch nicht!

    Doch, bei mir schon. Und reinschreiben kann man auch erst, wenn man diesen Button einmal angeklickt hat. Noch ein Nachteil ist, dass sich das Ding bei Aktivierung über alles rübermalt. Hab Win98 - nur zur Info. Kann sein, dass es auf XP anders ist.



  • @BigFusel: Die WM_COMMAND wird doch an das Parent versendet. Die Message kannst du also nicht empfangen, außer du schreibst dir einen Hook, aber dann wäre das SubClassen eh fürn A-rsch. Reagiere lieber auf WM_LBUTTONUP und teste, ob sich der MouseCursor auch über dem Button befindet.


Anmelden zum Antworten