Seite 1 von 1

(Erledigt)DeskDC = GetDC_(GetDesktopWindow_())mit3Monitoren?

Verfasst: 16.12.2017 22:48
von tft
Hallo,

für eine Funktion, die Daten aus dem Desktop Kopiert. Benötige ich den DC. Mit ExamineDesktops() sollten ja alle Daten der vorhandenen Desktop ermittelt werden. Aber ich kann den DC anderer Desktops nicht ermitteln, da die Funktion GetDesktopWindow_() keinen Parameter zulässt.

Hier die Procedure die ich verwenden möchte. Diese Funktioniert natürlich nicht. Weil der Parameter bei GetDesktopWindow_() nicht zulässig oder falsch ist.

Code: Alles auswählen

Procedure MakeDesktopScreenshot(ImageNr,x,y,Width,Height,DeskTop) 
  
  Static hImage
  If hImage = 0
    hImage = CreateImage(ImageNr,Width,Height) 
  EndIf

  hDC    = StartDrawing(ImageOutput(ImageNr)) 
  DeskDC = GetDC_(GetDesktopWindow_(DeskTop)) 
  BitBlt_(hDC,0,0,Width,Height,DeskDC,x,y,#SRCCOPY) 
  StopDrawing() 
  ReleaseDC_(GetDesktopWindow_(DeskTop),DeskDC) 
  ProcedureReturn hImage
    
EndProcedure 
Läst man den Parameter weg , funktioniert das Teil super.

Jemand eine Idee wie es Funktionieren könnte.

Gruss TFT

Re: DeskDC = GetDC_(GetDesktopWindow_()) mit 3 Monitoren?

Verfasst: 16.12.2017 23:56
von TroaX
Ähm was funktioniert denn nun nicht. Du schreibst nur du willst Daten aus einem Desktop. Für mich sieht es aus, das du nur einen Screenshot erstellen willst. Wenn dem so ist, wieso schreibst du es denn bitte nicht auch konkret?

Dann fehlt die Information, was du erreichen willst. Willst du ein Handle für den Desktop des jeweiligen Monitors? Oder willst du ein handle eines Fesnters auf dem jeweiligen Monitor? Willst du wissen, auf welchem Monitor ein Fenster angezeigt wird? GetDC ermittelt den Kontext mit Hilfe eines Window-Handles. Windows arbeitet allerdings mit einem einzigen Desktop-Window für alle Screens. Du müsstest aber die Koordinaten der einzelnen Desktops dank ExamineDesktops entsprechend auf dem Gesamtbild herauslösen können.

https://msdn.microsoft.com/en-us/librar ... s.85).aspx
http://www.flounder.com/virtual_screen_coordinates.htm

__________________________________________________
URL-Tags hinzugefügt
18.12.2017
RSBasic

Re: DeskDC = GetDC_(GetDesktopWindow_()) mit 3 Monitoren?

Verfasst: 17.12.2017 00:48
von ts-soft
So wie es TroaX gesagt hat, ist es richtig, also GetDesktopWindow_() ist korrekt. Die koordinaten für deinen Screenshot liegen also zwischen:

Code: Alles auswählen

Structure MaxDesktopsRes
  CountDesktops.w
  MinPos.w
  MaxPos.w
  MaxWidth.w
  MaxHight.w
EndStructure

Procedure DesktopsMaxRes(*r.MaxDesktopsRes)
  Protected Desktops.i = ExamineDesktops()
  Protected Desktop.i
  Protected X.i, Y.i, X1.i, Y1.i, X2.i, Y2.i

  For Desktop = 0 To Desktops-1
     If DesktopX(Desktop) < X
        X1 = DesktopX(Desktop)
     EndIf
     If DesktopY(Desktop) < Y
        Y1 = DesktopY(Desktop)
     EndIf
     If DesktopX(Desktop)+DesktopWidth(Desktop) > X2
        X2 = DesktopX(Desktop)+DesktopWidth(Desktop)
     EndIf
     If DesktopY(Desktop)+DesktopHeight(Desktop) > Y2
        Y2 = DesktopY(Desktop)+DesktopHeight(Desktop)
     EndIf
  Next
  
  *r\CountDesktops = Desktops
  *r\MinPos = X1
  *r\MaxPos = Y2
  *r\MaxWidth = X2-X1
  *r\MaxHight = Y2-Y1
EndProcedure

Define r.MaxDesktopsRes
DesktopsMaxRes(@r.MaxDesktopsRes)
Debug r\CountDesktops
Debug r\MinPos
Debug r\MaxPos
Debug r\MaxWidth
Debug r\MaxHight
Wenn du jetzt noch Wissen willst, auf welchem Desktop sich das jetzt befindet:

Code: Alles auswählen

Procedure DesktopFromPoint(x, y)
  Protected Count = ExamineDesktops()
  Protected i, dx, dy, dw, dh
  
  For i = 0 To Count - 1
    dx = DesktopX(i)
    dy = DesktopY(i)
    dw = DesktopWidth(i)
    dh = DesktopHeight(i)

    If x >= dx And x <= dx + dw And y >= dy And y <= dy + dh
      ProcedureReturn i
    EndIf 
  Next i 
 
  ProcedureReturn -1 ; point is outside of all monitors
EndProcedure
wobei der Code uninteressant ist, zur Ermittlung des Desktophandles.

Re: DeskDC = GetDC_(GetDesktopWindow_()) mit 3 Monitoren?

Verfasst: 17.12.2017 17:59
von tft
Hallo,

aaaa ja. Das erklärt warum die Funktion nicht die DC der separaten Desktops wiedergeben kann und muss.
Dann werde ich das anders lösen. Danke für die Info.

Gruss TFT