Einzelne Steuerelemente auf Desktop



  • Hat jemand eine Idee, wie ich ein Steuerelement wie ein Edit-Feld (Edit-Class-Window) auf den Desktop zaubere, dürfte der folgende Code funktionieren ?

    #include <windows.h>
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
    HWND hwnd=NULL,
    hwndedit=NULL;
    
    hwnd=GetDesktopWindow();
    
    hwndedit=CreateWindow("edit","",WS_CHILD | WS_VISIBLE,200,200,100,20,hwnd,NULL,hInstance,NULL);
    
    UpdateWindow(hwnd);
    
    return 0;
    }
    


  • Probier's doch aus, ob er funktioniert :D.

    cya 🙂



  • nee, geht nicht, aber wie funzt es dann ?



  • Doch das geht!
    Das habe ich schon gemacht!
    Du kannst dir zum Beispiel ein Edit auf das Desktop setzen.

    Ich guck mal schnell ob ichs noch hinbekomm...

    cu para
    😉



  • Doch, so geht das, aber wenn du nur den geposteten Code ausführst, verschwindet das Fenster sofort wieder, weil dein Programm zu Ende ist.



  • dankeschön...



  • #include <windows.h>
    #include <stdio.h>
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow)
    {
        HWND hDesktop = NULL;
        HWND hEdit    = NULL;
        hDesktop = GetDesktopWindow();
        hEdit    = CreateWindow("edit","DESKTOP", WS_CHILD | WS_VISIBLE,200,200,100,20,hDesktop, NULL,hInstance,NULL);
    
        UpdateWindow(hEdit);
        UpdateWindow(hDesktop);
    
        printf("Beenden mit q+Enter\r\n");
        while(getchar()!='q'){};
        return 0;
    }
    


  • @paranoiac.org: hast du das mal ausprobiert? printf und getchar in einer Windows-Anwendung? Das meinst du nicht ernst, oder?

    😃



  • nagut, aber ich denke mit dem grundsatz könnte er recht haben, werd es mal wagen... dank an euch



  • 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 ?


Anmelden zum Antworten