Seite 1 von 1

Fenster im Vordergrund Bitmap ausschneiden

Verfasst: Sonntag 26. Februar 2023, 08:47
von PyChe
Hallo,

ich bin komplett neu in Richtung python unterwegs. Ich möchte eine Funktion, welche ich in Delphi XE verwende in python portieren, bin jedoch noch nicht fündig geworden und noch am Anfang. Anbei der Code

Funktion
- Ermittle das Handle des Fenster, welches im Vordergrund läuft - hat den Fokus
- Ermittle den Titel/Name der Applikation
- Prüfe den Name, wenn o.k.
- Ermittle die Fenstergröße
- Ermittle den DC DeviceContext um auf die Grafik zuzugreifen
- Kopiere den Bildauschnitt in ein Bitmap
- Liefere das Bitmap und den Status zurück

Code: Alles auswählen

function GetBitmap( AppName:String; x,y,w,h:Integer; BM:TBitmap ):Boolean;
var
  Handle      : THandle;
  Title       : String;
  Len         : LongInt;
  WindowRect  : TRect;
  HD          : HDC;
  b           : Boolean;
begin
  b := False;

  Handle := GetForegroundWindow;

  if( Handle <> 0 )then
  begin
    Len := GetWindowTextLength( Handle ) + 1;
    SetLength( Title,Len );
    GetWindowText( Handle,PChar( Title ), Len );
    Title := Trim( Title );

    if( Title = AppName )then
    begin
      GetWindowRect( Handle, WindowRect );

      HD := GetDC( Handle );

      BM.Width  := w;
      BM.Height := h;

      BitBlt( BM.Canvas.Handle, 0, 0, w, h, HD, WindowRect.Width - x, WindowRect.Height - y, SRCCOPY );

      ReleaseDC( 0,HD );

      b := True;
    end;
  end;

  result := b;
end;
Im Aufruf wird der Speicher für das Bitmap reseriert. Bitmap geholt und bei Erfolg abgespeichert

Aufruf Beispiel

Code: Alles auswählen

  BM := TBitmap.Create;

  if( GetBitmap( 'TEST',x,y,w,h,BM )=True )then
  begin
    inc( i );

    PB.Canvas.Draw(0, 0, BM);

    s := 'C:\TEMP\Test'+Format('%.3d', [i]) + '.BMP';

    BM.SaveToFile( s );
  end;

  BM.Free;
Wie kann ich die Funktion in python umsetzten?

Auflösung habe ich bereits

Code: Alles auswählen

from tkinter import *

root = Tk()

monitor_height = root.winfo_screenheight()
monitor_width = root.winfo_screenwidth()
  
print("width x height = %d x %d (pixels)" %(monitor_width, monitor_height))
mainloop()
Aber wie auf ein "fremdes" Fenster zugreifen?

Danke und Gruß PyChe

Re: Fenster im Vordergrund Bitmap ausschneiden

Verfasst: Sonntag 26. Februar 2023, 09:32
von __deets__
Das sind ja am Ende einfach nur die win32 Aufrufe, die einem das ermöglichen. Dafür gibts das pywin32 Modul, siehe die etwas krepelige Dokumentation: https://mhammond.github.io/pywin32/win32ui.html

Damit musst du deine Aufrufe einfach nachbauen.

Re: Fenster im Vordergrund Bitmap ausschneiden

Verfasst: Sonntag 26. Februar 2023, 11:51
von PyChe
Hi,

danke für die Antwort. Hast du mir ein Beispiel?

Gruß PyChe

Re: Fenster im Vordergrund Bitmap ausschneiden

Verfasst: Sonntag 26. Februar 2023, 11:56
von PyChe
Hi,

und noch eine absolute Basic Frage - Wie installiere ich "win32ui" richtig. Hier finden sich in Google einige (gescheiterte) Beispiele

Gruß PyChe

Re: Fenster im Vordergrund Bitmap ausschneiden

Verfasst: Sonntag 26. Februar 2023, 12:07
von Sirius3
Eine kurze Suche liefert passenden Code: https://stackoverflow.com/questions/326 ... er-3260811

Re: Fenster im Vordergrund Bitmap ausschneiden

Verfasst: Sonntag 26. Februar 2023, 12:19
von __blackjack__
@PyChe: Ich würde es grundsätzlich ja erst einmal mit pip versuchen, also den üblichen Weg wie man so ziemlich jedes Python-Package installiert. Und dann sind gescheiterte Beispiele irgendwo im Netz uninteressant solange es bei *Dir* nicht scheitert. Falls doch, erst einmal die README.md vom Projekt durchgehen ob da ein Punkt zutrifft und die Lösung dort hilft.

Was für ein Beispiel suchst Du denn jetzt? Du hast doch die Funktionsnamen der Windows-API in Deinem Delphi-Quelltext. Da schaust Du jetzt in der Dokumentation vom `win32ui`-Modul nach wie die Signatur für den Aufruf aussieht und programmierst das einfach mehr oder weniger 1:1 nach. Es wird nicht ganz 1:1 sein, weil beispielsweise Zeichenketten in Python unveränderbar sind, und man deshalb nicht erst Speicher für den Fenstertitel belegen muss um dort den Text rein zu kopieren, sondern von der entsprechenden Funktion bereits eine Zeichenkette zurück bekommt. Falls es konkrete Probleme gibt, kannst Du ja konkrete Fragen stellen.

Ich würde das mit dem Boolean-Rückgabewert gleich schon mal überdenken, denn für so etwas würde ich eher eine Ausnahme verwenden.

Re: Fenster im Vordergrund Bitmap ausschneiden

Verfasst: Sonntag 26. Februar 2023, 13:13
von PyChe
Hi,

habe das Package installiert

Code: Alles auswählen

python -m pip install --upgrade pywin32
Defaulting to user installation because normal site-packages is not writeable
Collecting pywin32
  Downloading pywin32-305-cp311-cp311-win_amd64.whl (12.1 MB)
     ---------------------------------------- 12.1/12.1 MB 12.3 MB/s eta 0:00:00
Installing collected packages: pywin32
Successfully installed pywin32-305
in PyCharm wird

Code: Alles auswählen

import win32ui
jedoch noch immer mit einer Welle - sprich nicht bekannt - angezeigt - was tun?

Gruß PyChe

Re: Fenster im Vordergrund Bitmap ausschneiden

Verfasst: Sonntag 26. Februar 2023, 13:48
von __blackjack__
@PyChe: PyCharm erstellt für jedes Projekt ein eigenes virtualenv, das heisst man muss alles was man für das Projekt braucht in dieses virtualenv installieren, statt systemweit (oder für den aktuellen Benutzer).

Re: Fenster im Vordergrund Bitmap ausschneiden

Verfasst: Sonntag 26. Februar 2023, 13:49
von PyChe
Hallo,

bei mir scheint etwas schief zu sein - habe heute python installiert, keine Veränderungen. Danach xxx und wollte nun den MQTT Client installieren

Code: Alles auswählen

pip install paho-mqtt
wird über PyCharm auch nicht gefunden

Code: Alles auswählen

import paho.mqtt.client as mqtt
--> paho ist unterstrichen

Wiederholung bringt ...

Code: Alles auswählen

Requirement already satisfied: paho-mqtt in c:\users\PyChe\appdata\roaming\python\python311\site-packages (1.6.1)
Scheint was grundsätzliches zu sein

Gruß PyChe

Re: Fenster im Vordergrund Bitmap ausschneiden

Verfasst: Sonntag 26. Februar 2023, 13:52
von PyChe
Hallo,

danke für die Antwort.
@PyChe: PyCharm erstellt für jedes Projekt ein eigenes virtualenv, das heisst man muss alles was man für das Projekt braucht in dieses virtualenv installieren, statt systemweit (oder für den aktuellen Benutzer).
Wie kann ich die beiden Installationen (Win32ui, MQTT) jetzt wieder rückgängig machen? Gibt es eine gute Anleitung - wann und wo ich Packages installieren muss/sollte -> für das Projekt, Systemweit ...?

Gruß PyChe

Re: Fenster im Vordergrund Bitmap ausschneiden

Verfasst: Sonntag 26. Februar 2023, 13:57
von __blackjack__
@PyChe: Mit pip kann man auch Packages deinstallieren. pip hat auch eine Dokumentation mit Tutorials und allem drum und dran.

Re: Fenster im Vordergrund Bitmap ausschneiden

Verfasst: Sonntag 26. Februar 2023, 15:07
von Dennis89
Hallo,
PyChe hat geschrieben: Sonntag 26. Februar 2023, 13:52 Gibt es eine gute Anleitung - wann und wo ich Packages installieren muss/sollte -> für das Projekt, Systemweit ...?
wenn du das Projekt mit PyCharm entwickelst, dann installierst du alles was du brauchst über PyCharm, damit es in der bereits erwähnten Entwicklungsumgebung vorhanden ist.
Einfach auf EInstellungen -> Projekt -> Interpreter und dann auf den + - Button.

Grüße
Dennis

Re: Fenster im Vordergrund Bitmap ausschneiden

Verfasst: Sonntag 26. Februar 2023, 21:44
von PyChe
Hallo,

nach einigem hin und her und Einstellungen in PyCharm hat es nun funktioniert.Schließe nun diesen Beitrag ... es werden weitere Fragen folgen.

Danke für den EInstieg in python

Gruss PyChe