auf den desktop malen



  • Hi Leute,

    also ich weiß, dass das hier im Forum schon öfter angesprochen wurde, wie man auf den Desktop malt, ich hab trotzdem noch ne Frage dazu: ich habs schon geschafft, bei WM_PAINT auf den desktop zu malen. Jetzt wollt ichs mal außerhalb der WM_PAINT Nachricht versuchen, das hat aber nich geklappt. Und jetzt würd ich gern wissen wie das geht. Ich habs bis jetzt so gemacht:

    HWND desktop=GetDesktopWindow();
    HDC desktopdc=GetDC(desktop);
    
    // hier mal ich dann was
    
    ReleaseDC(desktop, desktopdc);
    

    Wenn ich das in dem normalen Fenster mach dann funktionierts auch, aber so nicht. Und ich weiß nich warum 😞
    Könnt ihr mir da weiterhelfen?

    MfG Daniel



  • also, das kann man jeder zeit machen

    hdc = getDc(0);
    mach was;
    releaseDC(0, hdc);

    das wird halt nur überschrieben, sobald du ein fesnter bewegst, aber zum schnellen testen von etwas reichts allemal



  • he cool danke so funktionierts 😃

    und wie sollt ichs machen wenn ich will dass es da bleibt?



  • wenn du das willst, musst du einen hook schreiben, der sich in die paint-nachricht vom desktop hängt.

    hooks sind recht komplex.
    Wenn du hierbei fehler machst, kannst du schon mal windows mit in den tod reißen, außerdem debugt sichs rech schwierig.

    edit:

    vorgehensweise:
    dll schreiben:

    dllEntry
    installHook
    uninstallHook
    hook_procedure:

    programm schreiben
    dass dll läd und installHook und uninstallHook aufruft

    hab leider grad nur ein asm-beispiel zur hand, aber die nötigen api-calls kannst du daraus ja ablesen (siehe invokes)

    das ganze ist aber ein mouseHook, MessageHooks gehen aber ähnlich

    .386
    .model flat,stdcall
    option casemap:none
    include windows.inc
    include kernel32.inc
    includelib kernel32.lib
    include user32.inc
    includelib user32.lib
    
    .data
    hInstance dd 0
    
    .data?
    hHook dd ?
    
    .code
    DllEntry proc hInst:HINSTANCE, reason:DWORD, reserved1:DWORD
    	push hInst
    	pop hInstance
      mov  eax,TRUE
      ret
    DllEntry Endp
    
    MouseProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD
      mov edx,lParam
      assume edx:PTR MOUSEHOOKSTRUCT
    
      ; mach etwas 
      invoke CallNextHookEx,hHook,nCode,wParam,lParam
    
      xor eax, eax ; eax öschen, da rückgabewert 0 sein muss
      xor edx, edx
      assume edx:nothing
      ret
    MouseProc endp
    
    InstallHook proc hwnd:DWORD
      invoke SetWindowsHookEx,WH_MOUSE,addr MouseProc,hInstance,NULL
      mov hHook,eax
      ret 
    InstallHook endp
    
    UninstallHook proc
      invoke UnhookWindowsHookEx,hHook
      ret
    UninstallHook endp
    
    End DllEntry
    


  • lol ok ich glaub das is n bisschen ziemlich viel zu hoch für mich aber danke für die antwort 😃
    gibts da nix einfacheres?


Anmelden zum Antworten