Fenster im Vordergrund Bitmap ausschneiden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
PyChe
User
Beiträge: 7
Registriert: Sonntag 26. Februar 2023, 08:43

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
PyChe
User
Beiträge: 7
Registriert: Sonntag 26. Februar 2023, 08:43

Hi,

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

Gruß PyChe
PyChe
User
Beiträge: 7
Registriert: Sonntag 26. Februar 2023, 08:43

Hi,

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

Gruß PyChe
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Eine kurze Suche liefert passenden Code: https://stackoverflow.com/questions/326 ... er-3260811
Benutzeravatar
__blackjack__
User
Beiträge: 14065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
PyChe
User
Beiträge: 7
Registriert: Sonntag 26. Februar 2023, 08:43

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
Benutzeravatar
__blackjack__
User
Beiträge: 14065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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).
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
PyChe
User
Beiträge: 7
Registriert: Sonntag 26. Februar 2023, 08:43

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
PyChe
User
Beiträge: 7
Registriert: Sonntag 26. Februar 2023, 08:43

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
Benutzeravatar
__blackjack__
User
Beiträge: 14065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PyChe: Mit pip kann man auch Packages deinstallieren. pip hat auch eine Dokumentation mit Tutorials und allem drum und dran.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
Dennis89
User
Beiträge: 1556
Registriert: Freitag 11. Dezember 2020, 15:13

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
"When I got the music, I got a place to go" [Rancid, 1993]
PyChe
User
Beiträge: 7
Registriert: Sonntag 26. Februar 2023, 08:43

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
Antworten