|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
frebas
Anmeldungsdatum: 20.06.2008 Beiträge: 245
|
Verfasst am: 11.10.2010, 10:29 Titel: Bild von einem anderen Fenster anzeigen |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4594 Wohnort: ~/
|
Verfasst am: 11.10.2010, 16:16 Titel: |
|
|
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 |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1874 Wohnort: D59192
|
Verfasst am: 12.10.2010, 12:31 Titel: CaptureWindow |
|
|
Das kam mir doch sehr bekannt vor
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 |
|
|
|
|
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.
|
|