Desktop einzelne Pixel ermitteln

Für allgemeine Fragen zur Programmierung mit PureBasic.
Kooky
Beiträge: 47
Registriert: 18.09.2004 16:13
Wohnort: München
Kontaktdaten:

Desktop einzelne Pixel ermitteln

Beitrag von Kooky »

Hiho,
hab schon wieder eine Frage:
Ich würde gerne den kompletten Desktop "fotographieren".
Also ich hab im CodeArchiv einige Codes gefunden, aber die machen immer komplette Bilder.
Was ich brauche sind mehr die einzelnen Werte.
Zum Beispiel das ich mir die einzelnen RGB Farbwerte für die Koordinate XY anzeigen lassen kann.
Das brauch ich, damit ich das besser verarbeiten kann.
Komplette Bilder brauche ich nicht.

Vielleicht hat jemand einen Vorschlag :) .

mfg. Kooky
Benutzeravatar
Ypser
XMas-Contest-Gewinner '03
Beiträge: 128
Registriert: 29.08.2004 14:35
Computerausstattung: Win7
Wohnort: Ingelheim
Kontaktdaten:

Beitrag von Ypser »

Such mal im Code-Archiv nach ColorPicker
Bild
Kooky
Beiträge: 47
Registriert: 18.09.2004 16:13
Wohnort: München
Kontaktdaten:

Beitrag von Kooky »

hmm
der läuft bei mir nicht
Zeile 52:
#Window object not initialised
damn
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

setz mal

Code: Alles auswählen

hdc = GetDC_(0)
ein
Kooky
Beiträge: 47
Registriert: 18.09.2004 16:13
Wohnort: München
Kontaktdaten:

Beitrag von Kooky »

hmm, dann bringt mir das programm wenig, da ich ja nicht nur die Pixel vom eigenen Fenster brauche, sondern vom kompletten desktop.... /:->

Hat jemand vielleicht noch eine bessere Idee?

mfg. Kooky
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Also ich arbeite mit folgendem

Code: Alles auswählen

; German forum: http://robsite.de/php/pureboard/viewtopic.php?t=2769
; Author: Ypser
; Date: 08. November 2003


;        GeTtHeCoLoR v1.0 
;        (ColorPicker) 
Enumeration 
  #Gadget_0 
  #Gadget_1 
  #Gadget_2 
  #Gadget_3 
  #RGB_Anzeige 
  #Hex_Anzeige 
  #Dez_Anzeige 
  #RGB_Check 
  #Hex_Check 
  #Dez_Check 
  #Show1 
  #Show2 
  #Info 
EndEnumeration 

#Event_Merken = 20 

Dim hw.s (5) 
Dim ActPixelColor (10, 8) 

InitKeyboard() 

If OpenWindow (0, 0, 0, 155, 110,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered , "GtC v1.0") 
  SetWindowPos_(WindowID(), #HWND_TOPMOST, 0, 0, 0, 0, #SWP_NOMOVE | #SWP_NOSIZE) 

  If CreateGadgetList(WindowID()) 
    TextGadget (#Gadget_0, 5, 8, 25, 15, "RGB:") 
    TextGadget (#Gadget_1, 5, 30, 25, 15, "Hex:") 
    TextGadget (#Gadget_2, 5, 53, 25, 15, "Dez:") 
    TextGadget (#Gadget_3, 5, 85, 32, 15, "Farbe:") 

    StringGadget (#RGB_Anzeige, 40, 5, 80, 18, "0, 0, 0", 0) 
    StringGadget (#Hex_Anzeige, 75, 28, 45, 18, "000000", 0) 
    StringGadget (#Dez_Anzeige, 40, 51, 80, 18, "0", 0) 
    OptionGadget (#RGB_Check, 135, 7, 20, 18, "") 
    OptionGadget (#Hex_Check, 135, 29, 20, 18, "") 
    OptionGadget (#Dez_Check, 135, 51, 20, 18, "") 
    ImageGadget (#Show1, 40, 75, 35, 29, 0, #PB_Image_Border) 
    ImageGadget (#Show2, 85, 75, 35, 29, 0, #PB_Image_Border) 
    ButtonGadget (#Info, 125, 85, 25, 15, "Info") 
    SetGadgetState (#Hex_Check, 1) 
  EndIf 
EndIf 

hdc = GetDC_(0) 
AddKeyboardShortcut (0, #PB_Shortcut_Space, #Event_Merken) 

ZU.s = Chr(13) + Chr(10) 
InfoText.s = "GeTtHeCoLoR v1.0" + ZU + "_______________________________________" + ZU + ZU 

InfoText + "Bedienung: Einfach den MouseCursor bewegen." + ZU 
InfoText + "Im linken Bild erscheint ein Auschnitt von dem," + ZU 
InfoText + "was unterm Cursor ist, im rechten die Farbe" + ZU 
InfoText + "GENAU unter dem Cursor." + ZU + ZU 
InfoText + "Oben steht der Farbwert in RGB, Hexadezimal" + ZU + "und Dezimal." + ZU 
InfoText + "Wenn man [Space] drückt, wird der Wert, hinter" + ZU 
InfoText + "dem das Häkchen gesetzt ist, in die Zwischen-" + ZU 
InfoText + "ablage gespeichert." + ZU + ZU 
InfoText + "(c) Ypser (F.H.), Nov. '03" 


While WindowEvent(): Wend 
CreateImage (0, 33, 27) 
CreateImage (1, 33, 27) 

ActHex.s = "" 

Repeat 
GetCursorPos_(Point.point)
  ActMouseX = (Point.point\x) 
  ActMouseY = (Point.point\y) 
  

  Select WindowEvent() 
    
    Case #PB_Event_CloseWindow 
      
      Quit = 1 
    
    Case #PB_Event_Gadget 
      
      Select EventGadgetID() 
        Case #Info 
          MessageRequester("GeTtHeCoLoR Info", InfoText, 0) 
      EndSelect 
    
    Case #PB_Event_Menu 
      
      If EventMenuID() = #Event_Merken 
        
        If GetGadgetState(#RGB_Check) = 1 
          SetClipboardText (GetGadgetText (#RGB_Anzeige)) 
        EndIf 
        
        If GetGadgetState(#Hex_Check) = 1 
          SetClipboardText (GetGadgetText (#Hex_Anzeige)) 
        EndIf 
        
        If GetGadgetState(#Dez_Check) = 1 
          SetClipboardText (GetGadgetText (#Dez_Anzeige)) 
        EndIf 
      
      EndIf 
  
  EndSelect 


  
  Delay(1) 
  
If (OldMouseX <> ActMouseX) Or (OldMouseY <> ActMouseY) 
  For Y = 0 To 8 
    For X = 0 To 10 
      ActPixelColor (X, Y) = GetPixel_(hdc, ActMouseX - 5 + X, ActMouseY - 4 + Y) 
    Next 
  Next 
  ActRed = Red (ActPixelColor (5, 4)) 
  ActGreen = Green (ActPixelColor (5, 4)) 
  ActBlue = Blue (ActPixelColor (5, 4)) 
  
  UseImage(0) 
  StartDrawing (ImageOutput()) 
    For Y = 0 To 8 
      For X = 0 To 10 
        Box (X * 3, Y * 3, 3, 3, ActPixelColor(X, Y)) 
      Next 
    Next 
  StopDrawing() 
  



  SetGadgetState (#Show1, UseImage(0)) 
  
  If OldColor <> ActPixelColor (5, 4) 
    Gosub HexColor 
    UseImage(1) 
    StartDrawing (ImageOutput()) 
    Box (0, 0, 33, 27, ActPixelColor(5, 4)) 
    StopDrawing() 
    
    SetGadgetState (#Show2, UseImage(1)) 

    SetGadgetText (#RGB_Anzeige, Str(ActRed) + ", " + Str(ActGreen) + ", " +Str(ActBlue)) 
    SetGadgetText (#Hex_Anzeige, ActHex) 
    SetGadgetText (#Dez_Anzeige, Str(ActPixelColor (5, 4))) 
  OldColor = ActPixelColor(5, 4) 
  EndIf 
  OldMouseX = ActMouseX 
  OldMouseY = ActMouseY 
EndIf 
;While WindowEvent(): Wend 
Until Quit 
ReleaseDC_(0, hdc);WindowID(35), hdc) 
End 



HexColor: 

  R1 = Int (ActRed / 16) 
  R2 = Int (ActRed - ( R1 * 16)) 
  hw (0) = Str (R1)  
  hw (1) = Str (R2) 
  
  G1 = Int (ActGreen / 16) 
  G2 = Int (ActGreen - ( G1 * 16)) 
  hw (2) = Str (G1)  
  hw (3) = Str (G2) 
  
  B1 = Int (ActBlue / 16) 
  B2 = Int (ActBlue - ( B1 * 16)) 
  hw (4) = Str (B1)  
  hw (5) = Str (B2) 
  

  ActHex = "" 

  For I = 0 To 5 
    Select hw (I) 
      Case "10" 
        hw (I) = "A" 
      Case "11" 
        hw (I) = "B" 
      Case "12" 
        hw (I) = "C" 
      Case "13" 
        hw (I) = "D" 
      Case "14" 
        hw (I) = "E" 
      Case "15" 
        hw (I) = "F" 
    EndSelect 
    ActHex + hw (I) 
  Next 
Return
,und der zeigt mir alles auf dem Bildschirm an.
Kooky
Beiträge: 47
Registriert: 18.09.2004 16:13
Wohnort: München
Kontaktdaten:

Beitrag von Kooky »

thanks
der geht. Also der aus dem Codearchiv suckz irgendwie.

mfg. Kooky
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

Kooky hat geschrieben:thanks
der geht. Also der aus dem Codearchiv suckz irgendwie.
Hast Du das CodeArchiv v2.0 - Preview ?
Darin sind viele Codes auf PB3.9x angepasst worden.

Ansonsten werde ich das auch nochmal überprüfen und ggf. obigen aktualisierten Code einfügen. :wink:
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Kooky
Beiträge: 47
Registriert: 18.09.2004 16:13
Wohnort: München
Kontaktdaten:

Beitrag von Kooky »

stimmt.
ich dachte ich hätte es aus dem code archiv 2 preview genommen ..
war doch ein irrtum. Also im 2er ist alles super.
Nochmals Thanks :allright:
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Der Code ist fast der aus dem neuen Codearchiv,
ich habe nur WindowMouseX() / Y() durch API
ersetzt, so dass das Programm auch funktioniert
wenn der Cursor nicht über dem eigenen Fenster ist.

Zeile 77

Code: Alles auswählen

GetCursorPos_(Point.point)
  ActMouseX = (Point.point\x) 
  ActMouseY = (Point.point\y) 
Antworten