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

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
tft
Beiträge: 605
Registriert: 08.09.2004 20:18
Computerausstattung: GTX Titan , i9 9900K , 32 GB Ram , 500 GB SSD , 3 ASUS FullHD Monitore and more
Wohnort: Dachsen
Kontaktdaten:

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

Beitrag 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
Zuletzt geändert von tft am 30.12.2017 16:55, insgesamt 1-mal geändert.
TFT seid 1989 , Turgut Frank Temucin , Dachsen/Berlin/Antalya
Aktuelles Projekte : Driving School Evergarden
YouTube : Pure Basic to go
FaceBook : Temuçin SourceMAgic Games
DISCORD : SourceMagic
W10 , i9 9900K ,32 GB Ram , GTX Titan , 3 Monitore FHD
ARDUINO Freak :-)
Benutzeravatar
TroaX
Beiträge: 659
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

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

Beitrag 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
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
tft
Beiträge: 605
Registriert: 08.09.2004 20:18
Computerausstattung: GTX Titan , i9 9900K , 32 GB Ram , 500 GB SSD , 3 ASUS FullHD Monitore and more
Wohnort: Dachsen
Kontaktdaten:

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

Beitrag 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
TFT seid 1989 , Turgut Frank Temucin , Dachsen/Berlin/Antalya
Aktuelles Projekte : Driving School Evergarden
YouTube : Pure Basic to go
FaceBook : Temuçin SourceMAgic Games
DISCORD : SourceMagic
W10 , i9 9900K ,32 GB Ram , GTX Titan , 3 Monitore FHD
ARDUINO Freak :-)
Antworten