Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Bild von einem anderen Fenster anzeigen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
frebas



Anmeldungsdatum: 20.06.2008
Beiträge: 245

BeitragVerfasst am: 11.10.2010, 10:29    Titel: Bild von einem anderen Fenster anzeigen Antworten mit Zitat

Hallo, ich möchte den Inhalt eines anderen Fensters anzeigen lassen, dazu habe ich folgenden code übernommen:
http://www.freebasic-portal.de/code-beispiele/grafik-und-fonts/screenshot-erstellen-grafikimage-139.html

Dieser code soll die Taskleiste kopieren:
http://www.freebasic-portal.de/porticula/bild-eines-anderen-fensters-anzeigen-1166.html

Wenn man den 2. code ausführt kommt wie zu erwarten, ein kleines weißes kästchen, da "bild = CaptureWindow(fenster)" auskommentiert ist und somit nicht in den bildpuffer geschrieben wird. Das seltsame kommt jetzt, wenn diese zeile nicht mehr auskommentiert ist wird das ganze grafikfenster weiß, obwohl der bildpuffer nur 48x48 pixel groß ist.
Außerdem wird der fensterinhalt nicht in den bildpuffer geschrieben was wahrscheinlich daran liegt dass der code nicht mehr mit den aktuellen FBC funktioniert.

edit: den paint befehl sollte man auch auskommentieren, aber man sieht so, dass irgendwas nicht stimmen kann.

lösung: die funktion "GetActiveWindow" gibt einen pointer mit dem wert 0 zurück dadurch gibt "CaptureWindow" auch 0 zurück und paint benutzt dann den bildschirmpuffer.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 11.10.2010, 16:16    Titel: Antworten mit Zitat

Mal so nebenbei:
Code:
  Return img
  IMAGEDESTROY img

ist ziemlich sinnfrei, weil die Zeile hinter dem RETURN sowieso nicht mehr ausgeführt wird. Da würde ich entweder 'bild' BYREF übergeben, damit deine Funktion gleich dorthinein schreiben kann, oder vorneweg keinen Speicher für 'bild' reservieren, sondern den von der Funktion zurückgegebenen verwenden. Den Speicher wieder freigeben musst du so oder so außerhalb der Funktion.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 12.10.2010, 12:31    Titel: CaptureWindow Antworten mit Zitat

Das kam mir doch sehr bekannt vor grinsen
Hier für die Taskleiste:
Code:
#Include "windows.bi

'wird bei der Taskleiste nicht gebraucht!
'SUB AbNachVorn (ByVal Handle AS HANDLE)
'  DIM AS WINDOWPLACEMENT WndPlcmt
'  SetWindowPos Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE
'  SetWindowPos Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE
'  SetFocus Handle
'  WITH WndPlcmt
'    .Length = SIZEOF(WndPlcmt)
'    IF GetWindowPlacement(Handle, @WndPlcmt) THEN
'      IF .showCmd = SW_SHOWMINIMIZED THEN
'        .flags = 0
'        .showCmd = SW_SHOWNORMAL
'        SetWindowPlacement(Handle, @WndPlcmt)
'      ELSE
'        SetForegroundWindow(Handle)
'        BringWindowToTop(Handle)
'      END IF
'    END IF
'  END WITH
'END Sub

Dim Shared As Any Ptr img
Function CaptureWindow( ByVal hwndSrc As HWND) As Any Ptr
  'AbNachVorn(hWndSrc)
  Dim As RECT r
  GetWindowRect(hWndSrc, @r) 'Fenstergroesse feststellen
  Dim As Integer b = r.right - r.left
  Dim As Integer h = r.bottom - r.top
  img = ImageCreate(b, h)
  b = (b+3) And -4 'Bildbreite glatt durch 4 teilbar

  Dim As HDC hdcSrc = GetWindowDC(hWndSrc)
  Dim As HDC hdcMem = CreateCompatibleDC(hdcSrc)
  Dim As HBITMAP hBmp = CreateCompatibleBitmap(hdcSrc, b, h)
  SelectObject(hdcMem, hBmp)
  BitBlt(hdcMem, 0, 0, b, h, hdcSrc, 0, 0, SRCCOPY)
  Dim As BITMAPINFO bmi
  With bmi.bmiHeader
    .biSize = SizeOf(BITMAPINFOHEADER)
    .biWidth =  b          'breite
    .biHeight = -h         '-hoehe (sonst Kopfstand)
    .biPlanes = 1
    .biCompression = BI_RGB
    .biBitCount = 32
  End With
  If (img) Then 'Bilddaten in das Image kopieren
    GetDIBits(hdcMem, hBmp, 0, h, img + 32, @bmi, DIB_RGB_COLORS)
  End If

  DeleteObject(hBmp)
  DeleteDC(hdcMem)
  ReleaseDC(hWndSrc, hdcSrc)
  Return img
End Function

' =========== Test der CaptureWindow Function ===========
Screen 18, 32
'Dim As HWND hWndSrc = FindWindow(Null, "Arbeitsplatz")
Dim As HWND hWndSrc = FindWindow("shell_traywnd", Null)'Taskleiste

If hWndSrc = 0 Then
  Print "kein Fenster gefunden .."
  Sleep
  End
End If

img = CaptureWindow(hWndSrc)
If img Then
  Dim As Integer w, h
  ImageInfo (img, w , h)
  ScreenRes w, h, 32
  'Windowtitle "CaptureWindow"
  Put (0,0), img, PSet
  'AbNachVorn(FindWindow( Null, "CaptureWindow"))
End If

Sleep
If img <> 0 Then ImageDestroy img


_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz