Hast du denn einfach mal versucht die Unitliste zu übernehmen und so geschaut, ob deine Vermutung richtig ist?
@Furtbichler:
Dann müßten doch aber auch schon die 3 Befehle davor nicht funktionieren.
Aber dennoch kann man das ja einfach mal prüfen. (Namespace, wie von Furtbichler genannt, oder die Reihenfolge der beiden Units ändern)
Und da die Meldung erst kommt, wenn der Befehl "aufgerufen" wird, kann es kein Compilerproblem sein.
Nja, aber eventuell war das nur falsch ausgedrückt und er meinte den Compiler-Fehler.
PS: Sicher daß du alles richtig verstanden hast?
Im Prinzip ist dieser Befehl nichtmal wichtig, so daß man ihn auch einfach weglassen könnte.
Zitat:
function ScreenshotHidden(wnd: HWND; const bmp: TBitmap): Boolean;
·var
· ·rec: TRect; //zum Zwischenspeichern der Fenstergröße
· ·caption: string;
· ·Size : Cardinal;
· ·MemLocal : ^TBitmap;
· ·MemRemote : ^TBitmap;
· ·Process : THandle;
· ·ProcessId : DWORD;
· ·NumBytes : Cardinal;
· ·ListView : HWND;
· ·b : TBitmap;
· ·InfoHeaderSize : Cardinal;
· ·ImageSize : Cardinal;
·begin
· ·Result := False; //Rückgabewert initialisieren
· ·GetWindowRect(wnd, rec); //Größe des Fensters auslesen...
· ·bmp.Width := rec.Right - rec.Left; //...und die Bitmap-Größe anpassen
· ·bmp.Height := rec.Bottom - rec.Top;
· ·bmp.PixelFormat := pf24Bit; // Datenmassen in Zaum halten
· ·bmp.SetSize(bmp.Width, bmp.Height); ·// Wozu eigentlich die Größe nochmals auf sich selber setzen?
· ·{Graphics.}GetDIBSizes(bmp.Handle, InfoHeaderSize, ImageSize);
· ·bmp.Canvas.Lock; //Zugriff auf den Canvas für andere Threads blockieren
· ·try
· · ·b:=TBitmap.Create;
· · ·b.Width:=bmp.Width;
· · ·b.Height:=bmp.Height;
· · ·b.PixelFormat:=bmp.PixelFormat;
· · ·// Fensterhandle des Desktop-ListView ermitteln und Prozess oeffnen
· · ·ListView := wnd;
· · ·ProcessId := 0;
· · ·GetWindowThreadProcessId(ListView wnd, @ProcessId);
· · ·Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_OPERATION or
· · · · · · · · ·PROCESS_VM_READ or PROCESS_VM_WRITE, False, ProcessId);
· · ·if Process <> 0 then begin
· · · ·try
· · · · ·Size := ImageSize;
· · · · ·MemRemote := VirtualAllocEx(Process, nil, Size ImageSize, MEM_COMMIT, PAGE_READWRITE);
· · · · ·MemLocal := VirtualAlloc(nil, ImageSize, MEM_COMMIT, PAGE_READWRITE);
· · · · ·try
· · · · · ·if Assigned(MemLocal) and Assigned(MemRemote) then begin
· · · · · · ·SendMessage(wnd, WM_PRINT, Integer(MemRemote), PRF_ERASEBKGND or PRF_CLIENT or PRF_CHILDREN);
· · · · · ·end;
· · · · · ·if ReadProcessMemory(Process, MemRemote, bmp.Canvas, Size ImageSize, NumBytes) then begin
· · · · · · ·RaiseLastOSError; ·// könnte auch sein, daß es unter D7 noch RaiseLastWin32Error hieß
· · · · · ·end;
· · · · ·finally
· · · · · ·VirtualFreeEx(Process, MemRemote, 0, MEM_RELEASE); // Wann hattest du vor MemRemote wieder freizugeben?
· · · · ·end;
· · · ·except finally
· · · · ·CloseHandle(Process); // Wann hattest du vor Process wieder freizugeben?
· · · ·end;
· · ·end else
· · · ·RaiseLastOSError; //RaiseLastWin32Error
· ·finally
· · ·bmp.Canvas.Unlock; //Zugriff wieder erlauben
· ·end;
·end;