Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0201: Clientbereich fremder Fenster pixelweise auslesen

 von 

Beschreibung 

Nunja, wofür es so richtig nützlich sein soll, weiß ich auch nicht so recht. Die Frage kommt aus dem Forum. Zumindest lässt sich hiermit das Fenster einer beliebigen Anwendung, sofern nicht verdeckt, pixelweise auslesen. Das macht nur Sinn wenn nur ein oder ein paar weinge, bestimmte Pixel erforderlich sind. Ansonsten ließe sich das mit der BitBlt viel zügiger umsetzen.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

FindWindowA (FindWindow), GetClientRect, GetDC, GetPixel, GetWindowRect

Download:

Download des Beispielprojektes [2,3 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Beschriftungsfeld "Label1"

Option Explicit
  
Private Declare Function FindWindow Lib "user32" Alias _
        "FindWindowA" (ByVal lpClassName As String, ByVal _
        lpWindowName As String) As Long

Private Declare Function GetDC Lib "user32" (ByVal hwnd _
        As Long) As Long
 
Private Declare Function GetPixel Lib "gdi32" (ByVal _
        hdc As Long, ByVal x As Long, ByVal y As Long) _
        As Long

Private Declare Function GetWindowRect Lib "user32" (ByVal _
        hwnd As Long, lpRect As RECT) As Long

Private Declare Function GetClientRect Lib "user32" (ByVal _
        hwnd As Long, lpRect As RECT) As Long

Private Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type

Private Sub Form_Load()
  Dim xhWnd&, xhDC&, x&, y&, pCol&
  Dim dx&, dy&, r As RECT, offy&
    
    Label1.Visible = False
    With Me
      .Caption = "Fälschung"
      Call Shell("calc.exe")
      xhWnd = FindWindow(vbNullString, "Rechner")
      
      Call GetWindowRect(xhWnd, r)

      .Width = (r.Right - r.Left) * Screen.TwipsPerPixelX
      .Height = (r.Bottom - r.Top) * Screen.TwipsPerPixelY
      
      xhDC = GetDC(xhWnd)
      Call GetClientRect(xhWnd, r)
      dx = r.Right - r.Left
      dy = r.Bottom - r.Top
      offy = .ScaleHeight / Screen.TwipsPerPixelY - dy
      
      .ScaleMode = vbPixels
      .AutoRedraw = True
      .Refresh
      
      For x = 0 To dx
        For y = 0 To dy
          pCol = GetPixel(xhDC, x, y)
          Me.PSet (x, y + offy), pCol
        Next y
      Next x
      .Refresh
      .AutoRedraw = False
    End With
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 3 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Alain WIND am 26.09.2003 um 17:20

Hallo,
Ich mochte eine Picturebox die grösser ist als das Bildschirm duplizieren (eine Copy machen).
Auf der Picturebos habe ich controls (VB6 und Eingene).
Ich habe die "Print a Form That Is Larger Than the Screen" von microsoft versucht aber die controls werden nicht copiert.
Ich habe auch Bitblts versucht aber nur was am Bildshirm ist wird copiert.
Man hat mir WM_PrintClient empfohlen. ich finde aber keinen Beispiel.
Einen tip?

Im voraus vielen Dank.

MFG
ALAIN
Gibt es eine Lösung

Kommentar von claudia am 03.08.2001 um 04:47

ich habe gewartet, ... aber da kam nichts - koenntet ihr dazuschreiben, dass in der englischen vb-version in
xhWnd = FindWindow(vbNullString, "Rechner")
der rechner ein "Calculator" ist?

Kommentar von Mats Vanselow am 15.01.2001 um 16:30

Leider aktualisiert der Code die erstellte Grafik nicht! Wie kann ich das ändern? Bitte antworten, wer es weiß.