ScreenShots wegen der "lieben" Kleinen...

Anwendungen, Tools, Userlibs und anderes nützliches.
Micro
Beiträge: 59
Registriert: 28.12.2006 17:44
Computerausstattung: Intel 10850K, 16GB RAM
div. andere Rechner...
Wohnort: Nordkirchen

ScreenShots wegen der "lieben" Kleinen...

Beitrag von Micro »

Hi Leute,

ich hatte die Tage das Problem, das von einer Bekannten der Kurze (13 J.) sich Netzseiten angesehen hatte, die nix für ihn sind. Sie hatte mich darauf angesprochen, ob es nicht eine Möglichkeit zur Überwachung gibt.

Ich fand so ein Freeware-Tool, das sich AutoScreenShot nannte. Kurzerhand installiert und stellte fest: nix geht. Schrott, das Teil. Also habe ich mich daran gemacht, selbst so ein Teil zu zaubern.

Die Soft erstellt in frei angebbaren Zeiten (in Sekunden) Screenshots vom Desktop. Die Anzahl der Bilder, die in einem frei wählbaren Verzeichnis abgelegt werden, können auch bestimmt werden. Ebenso kann man es mit dem Rechnerstart gleich mit starten lassen.

Bevor ich es vergesse: Keine Garantie oder dergleichen, der übliche Quatsch also. Getestet unter XP. Hier der Quellcode von dem Teil:

Code: Alles auswählen

#offsetX = 0 
#offsetY = 0 
#percentX = 1
#percentY = #percentX 

Parameter$ = LCase(RemoveString(ProgramParameter(0),"/"))
Parameter$ = "config"

UsePNGImageEncoder()

LoadFont(0, "Arial", 10)
LoadFont(1, "Arial", 10, #PB_Font_Bold)
LoadFont(2, "Arial", 8)

;--- Regestry-Werte
HKey.l = #HKEY_LOCAL_MACHINE
SKey_Autostart.s = "\Software\Microsoft\Windows\CurrentVersion\Run"
SKey.s = "\Software\ScreenShot"
Value.s = "ScreenShot"
Value1.s = "Time"
Value2.s = "Number"
Value3.s = "Directory"
Value4.s = "Autostart"

Procedure.s spec_folder(clsi_const.l) 
   path.s = Space(2048) 
   SHGetSpecialFolderLocation_(0,clsi_const,@pidl.l) 
   SHGetPathFromIDList_(pidl,@path) 
   CoTaskMemFree_(pidl) 
   ProcedureReturn path+"\" 
EndProcedure

result1.s = JHRegGetString(HKey.l, SKey.s, Value1.s)
If result1.s = ""
   JHRegCreateKey(HKey.l, SKey.s) 
   JHRegSetString(HKey.l, SKey.s, Value1.s, "200")
   JHRegSetString(HKey.l, SKey.s, Value2.s, "500")
   JHRegSetString(HKey.l, SKey.s, Value3.s, spec_folder($27))
   JHRegSetString(HKey.l, SKey.s, Value4.s, "1")
EndIf

Time.l = Val(JHRegGetString(HKey.l, SKey.s, Value1.s))
Global Number.l = Val(JHRegGetString(HKey.l, SKey.s, Value2.s))
Global Directory.s = JHRegGetString(HKey.l, SKey.s, Value3.s)
Autostart.s = JHRegGetString(HKey.l, SKey.s, Value4.s)
Global schleife.l = 0

Procedure BildVerzeichnisLoeschen(Directory.s, Number.l)

AnzahlBilder.l = 0
If ExamineDirectory(0, Directory.s, "*.png")  
  While NextDirectoryEntry(0)
    AnzahlBilder.l = AnzahlBilder.l + 1
  Wend
  FinishDirectory(0)
EndIf

Structure Bilder
  Name$
  Nummer.l
EndStructure

NewList Bildarray.Bilder()

X = 1
If ExamineDirectory(0, Directory.s, "*.png")  
  While NextDirectoryEntry(0)
      AddElement(Bildarray())
      Bildarray()\Nummer = X
      Bildarray()\Name$ = DirectoryEntryName(0)
      X = X + 1
  Wend
  FinishDirectory(0)
EndIf

SortStructuredList(Bildarray(), 0, OffsetOf(Bilder\Name$), #PB_Sort_String)

ForEach Bildarray()
   If Bildarray()\Nummer <= AnzahlBilder.l - Number.l
    Ergebnis = DeleteFile(Directory.s + Bildarray()\Name$)
    If Ergebnis = 0
      MessageRequester("Hinweis", "Fehler in der Datenbank!" + Chr(13) + "Bitte das System neu starten!", #MB_ICONWARNING)
      End
    EndIf
  EndIf
Next

EndProcedure

Procedure SaveScreenEx(offsetX.f, offsetY.f, widthPercent.f, heightPercent.f) 
    hDcDesktop  = GetDC_(GetDesktopWindow_()) 
    
    w = GetSystemMetrics_(#SM_CXSCREEN) 
    h = GetSystemMetrics_(#SM_CYSCREEN) 
    CreateImage(0, w, h) 
      
    hDC = StartDrawing(ImageOutput(0)) 
      BitBlt_(hDC, 0, 0, w, h, hDcDesktop, 0, 0, #SRCCOPY) 
    StopDrawing() 

    ReleaseDC_(GetDesktopWindow_(), hDcDesktop) 

    GrabImage(0, 1, offsetX * w, offsetY * h, widthPercent * w, heightPercent * h) 
    FreeImage(0) 

    Datum.s = FormatDate("%yyyy%mm%dd-%hh%ii%ss", Date())
    Ergebnis = SaveImage(1, Directory.s + Datum.s + ".png" ,#PB_ImagePlugin_PNG )

    If Ergebnis <> 1
      MessageRequester("Wichtiger Hinweis von der Anwendung!", "Fehler in der Datenbank!" + Chr(13) + "Bitte den Administrator benachrichtigen!", #MB_ICONERROR)
      End
    Else
      schleife.l = schleife.l + 1
      If schleife.l = 10
        BildVerzeichnisLoeschen(Directory.s, Number.l)
        schleife.l = 0
      EndIf

    EndIf
        
EndProcedure 

Procedure.s GetAppDir() 
  FullPath.s = Space(#MAX_PATH) 
  GetModuleFileName_(GetModuleHandle_(0), @FullPath, #MAX_PATH) 
  FullPath = GetPathPart(FullPath) 
  If Right(FullPath, 1) <> "\" : FullPath + "\" : EndIf 
  ProcedureReturn FullPath 
EndProcedure 

Procedure.s GetAppName() 
  AppName.s = Space(#MAX_PATH) 
  GetModuleFileName_(GetModuleHandle_(0), @AppName, #MAX_PATH) 
  ProcedureReturn GetFilePart(AppName) 
EndProcedure 

Procedure Beenden()
  Result = MessageRequester(" Beenden","Programm wirklich beenden?",#PB_MessageRequester_YesNo|#MB_ICONQUESTION)
  If Result = #PB_MessageRequester_Yes
    End
  EndIf
EndProcedure

If Parameter$ = "config"

  jahr$ = FormatDate("%yyyy", Date())
  If jahr$ > "2009"
    jahranzeige$ = "2009 - " + jahr$
  Else
    jahranzeige$ = jahr$
  EndIf

  OpenWindow(0, 0, 0, 330, 240, "ScreenShot Optionen", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  CreateGadgetList(WindowID(0)) 
  SetGadgetFont(#PB_Default, FontID(0))
  
  TextGadget(0, 10, 10, 310, 20, "Screenshot V1.0", #PB_Text_Center)
  SetGadgetFont(0, FontID(1))

  TextGadget(12, 10, 30, 310, 20, Chr(169) + " " + jahranzeige$ + " by Micro (http://www.purebasic.fr/german/)", #PB_Text_Center)
  SetGadgetFont(12, FontID(2))

  TextGadget(1, 10, 50, 170, 20, "Zeit zwischen zwei Bildern:") ; Zeit
  StringGadget(2, 190, 50, 55, 20, "" , #PB_String_Numeric | #PB_Text_Right) ; Zeit
  TextGadget(3, 260, 50, 70, 20, "Sekunden") ; Zeit
  SetGadgetText(2, Str(Time.l)) ; Zeit

  TextGadget(4, 10, 80, 170, 20, "Anzahl der Bilder:") ; Bilder
  StringGadget(5, 190, 80, 55, 20, "" , #PB_String_Numeric | #PB_Text_Right) ; Bilder
  TextGadget(6, 260, 80, 70, 20, "maximal") ; Bilder
  SetGadgetText(5, Str(Number.l)) ; Bilder

  TextGadget(7, 10, 110, 80, 20, "Verzeichnis:") ; Verzeichnisanzeige
  StringGadget(8, 85, 110, 200, 20, "") ; Verzeichnisanzeige
  SetGadgetText(8, Directory.s) ; Verzeichnisanzeige
  ButtonGadget(9, 295, 110, 25, 20, "...") ; Verzeichnisanzeige

  CheckBoxGadget(10, 10,  140, 310, 20, "Programm automatisch starten") ; Autostart
  SetGadgetState(10,Val(Autostart.s)) ; Autostart

  TextGadget(11, 10, 170, 310, 20, "Update wird beim nächsten Systemstart wirksam", #PB_Text_Center)
  SetGadgetFont(11, FontID(1))
  SetGadgetColor(11, #PB_Gadget_FrontColor, RGB(00, 00, 255))

  ButtonGadget ( 20, 10, 200, 90, 25, "Abbrechen") 
  ButtonGadget ( 21, 230, 200, 90, 25, "OK") 

  Repeat 
    Event = WaitWindowEvent() 
    Select Event 
      Case #PB_Event_Gadget 
        Select EventGadget()

        Case 9
          InitialPath$ = GetGadgetText(8)   ; anfänglichen Pfad für die Anzeige festlegen (kann auch leer sein)
          Path$ = PathRequester("Bitte wählen Sie einen Pfad aus, in dem die Bilder gespeichert werden sollen.", InitialPath$)
          If Path$
            SetGadgetText(8, Path$)
          Else
            MessageRequester("Information", "Der Requester wurde abgebrochen.", #MB_ICONWARNING) 
          EndIf
        
         Case 20
          Beenden()
          
          Case 21 ; Speichern
            If GetGadgetText(2) = "" Or GetGadgetText(5) = "" Or GetGadgetText(8) = ""
              ResultSpeichern = MessageRequester("Achtung", "Es wurde ein Feld nicht ausgefüllt. Dies ist aber für den Betrieb der Software notwenig!" + Chr(13) + Chr(13) + "Klicken Sie auf " + Chr(34) + "Ja" + Chr(34) + " , um die Autostart-Funktion zu deaktivieren und das Programm zu beenden." + Chr(13) + "Klicken Sie auf " + Chr(34) + "Nein" + Chr(34) + ", um zu den Einstellungen zurückzukehren.", #PB_MessageRequester_YesNo | #MB_ICONWARNING)
              If ResultSpeichern = #PB_MessageRequester_Yes  
                Debug ""
                
                JHRegDelValue(HKey.l, SKey_Autostart.s, GetAppDir() + GetAppName())
                JHRegSetString(HKey.l, SKey.s, Value1.s, GetGadgetText(2))
                JHRegSetString(HKey.l, SKey.s, Value2.s, GetGadgetText(5))
                JHRegSetString(HKey.l, SKey.s, Value3.s, Chr(34) + GetGadgetText(8) + Chr(34))
                JHRegSetString(HKey.l, SKey.s, Value4.s, Str(GetGadgetState(10)))
                End
              EndIf     
            Else
              JHRegSetString(HKey.l, SKey.s, Value1.s, GetGadgetText(2))
              JHRegSetString(HKey.l, SKey.s, Value2.s, GetGadgetText(5))
              JHRegSetString(HKey.l, SKey.s, Value3.s, GetGadgetText(8))
              JHRegSetString(HKey.l, SKey.s, Value4.s, Str(GetGadgetState(10)))
              If GetGadgetState(10) = 1
                JHRegSetString(HKey.l, SKey_Autostart.s, Value.s, GetAppDir() + GetAppName())
              Else
                JHRegDelValue(HKey.l, SKey_Autostart.s, Value.s)
              EndIf
              MessageRequester("Hinweis", "Einstellungen erfolgreich gespeichert!", #MB_ICONINFORMATION)
              Beenden()
            EndIf
          
          
        EndSelect
      Case #PB_Event_CloseWindow 
        Beenden() 
    EndSelect 
  Until Quit = 1

; Ende Config

Else

  Repeat 

    SaveScreenEx(#offsetX, #offsetY, #percentX, #percentY)
    Delay(Time.l * 1000)
  ForEver 
  
EndIf
End

; IDE Options = PureBasic v4.02 (Windows - x86)
; CursorPosition = 1
; Folding = --
; EnableXP
; UseIcon = 
; Executable = ScreenShot.exe
Hinweis:
Ich habe folgende Libs eingebunden: UserLib JHRegistry_400 von / by Jens Haipeter

Wird das Tool ohne Parameter aufgerufen, macht es seinen Dienst :-) Mit den Parameter "/config"... Sagt ja der Name :-)
Ich hoffe, das der eine oder andere vielleicht damit was anfangen kann!

Gruß Frank
PB 5.73 LTS - Win 11 Pro / 64Bit
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: ScreenShots wegen der "lieben" Kleinen...

Beitrag von ts-soft »

Auf das Programm direkt kann ich jetzt nicht eingehen, weil ich weder die alte PB Version, noch die UserLib
installiert habe, aber zu Deinem Source-Stil möchte ich noch was anmerken :)

Das Mixen von Code und Proceduren macht das Lesen etwas schwer. Wenn dann in einer Procedure noch
nicht mal eingerückt wird, wirds dann richtig unübersichtlich. Eine Strukture hat in einer Procedure auch
nichts zu suchen, weil die ist immer Global und sollte entsprechend auch ausserhalb der Procedure deklariert
werden.

Desweiteren rate ich Dir unbedingt mit EnableExplicit zu arbeiten.

Bei 250 Zeilen findeste Dich vielleicht gerade noch zurecht, weils überschaubar ist, aber das ändert sich
mit Zunahme an Zeilen sehr schnell.

Gruß
Thomas
Micro
Beiträge: 59
Registriert: 28.12.2006 17:44
Computerausstattung: Intel 10850K, 16GB RAM
div. andere Rechner...
Wohnort: Nordkirchen

Re: ScreenShots wegen der "lieben" Kleinen...

Beitrag von Micro »

Hi Thomas,

danke für die Tipps.
Obwohl ich schon seid 2006 angemeldet bin, zähle ich mich immer noch zu den Anfängern. Ich schaffe es zeitlich nicht, mich mehr um PB zu kümmern. Deswegen bin ich für Tipps und Hilfen immer empfänglich.

Ich werde mir das die Tage anschauen und versuchen, Deine Tipps anzuwenden. Das EnableExplicit ist also das error_reporting unter PHP, oder? Aber das bekomme ich hin (denke ich).

Gruß Frank
PB 5.73 LTS - Win 11 Pro / 64Bit
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: ScreenShots wegen der "lieben" Kleinen...

Beitrag von TomS »

Micro hat geschrieben:Das EnableExplicit ist also das error_reporting unter PHP, oder?
Naja. Nicht ganz. Error_Reporting ist ja für Fehleranzeige, Fehlderunterdrückung und Abbruch bei Fehlern zuständig. PB bricht bei (Syntax-)Fehlern immer ab.

EnableExplicit bewirkt, dass der Compiler mit einer Fehlermeldung abbricht, wenn eine Variable nicht explizit vorher definiert wurden ist (Define, Global...).
Das hilft bei der Fehlersuche enorm, wenn es sich um Tippfehler handelt.

Code: Alles auswählen

EnableExplicit ;Bitte mal auskommentieren und erneut testen
Define das_ist_eine_variable.i = 10
Debug das_ist_eine_vaiable ;Uups. Ein r vergessen
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: ScreenShots wegen der "lieben" Kleinen...

Beitrag von helpy »

Hallo,

Zum eigentlichen Problem:

Das mit den Screenshots finde ich keine so gute Sache! Überwachung in der Form finde ich nicht so gut! Nur zur Info: Ich bin fast 46 und spreche hier als Vater.

Wenn ich nicht möchte, dass bestimmte Seiten auf einem PC angezeigt werden, dann gibt es mehrere Möglichkeiten:
  • Content-Filter (im Browser), die den Inhalt überprüfen und evt. die Anzeige der Seite blocken!
  • Einen transparenten Proxy (URL und Content Filterung) auf dem PC installieren. Ist nur sinnvoll, wenn der Teenager keine Admin-Rechte hat, ansonsten kann er es selbst aushebeln.
  • Einen Proxy-Server auf dem Router installieren. Das hatte ich eine Zeit lang auf meiner Fritz!Box laufen.
  • OpenDNS als DNS-Server auf dem PC oder im Router eintragen. Dieser Dienst blockiert je nach Einstellung ganz bestimmte Seiten.
Das alles kann man vergleichen mit einem schützenden Zaun, den man um sein Kind baut, wobei keiner davon wirklich 100%ig sicher ist. Man muss jedoch aufpassen, dass dieser Zaun nicht zu einem Gefängnis wird! So wie man einem Kind beibringt sich im Straßenverkehr und unter Menschen zu bewegen, so wäre es auch angebracht seinem Kind zu helfen, mit dem Internet richtig umzugehen. Das wird aber nicht durch Überwachung (wie oben beschrieben) funktionieren. Am besten man beginnt mit dem Kind/Teenager gemeinsam durch die Straßen des Internets zu gehen und auf Gefahren aufmerksam zu machen. Ja! Das kostet Zeit! Aber auch das Bauen von Zäunen braucht Zeit und geschieht auf eine Art und Weise, die in der Regel die Beziehung zum Kind negativ beeinflusst.

Erfährt ein Teenager mit 13J., dass sein PC auf irgendeine Weise überwacht wird, dann wird das die Beziehung der Eltern zu ihrem Kind nicht sehr vorteilhaft beeinflussen. Das stärkt das Misstrauen!

Wir bringen unseren Kindern bei, sich im Straßenverkehr zu bewegen! Wir lehren sie, gute Entscheidungen zu treffen, die sie sicher durch den Straßenverkehr bringen ... und zwar so, dass sie sich auch alleine im Straßenverkehr bewegen können. Dasselbe wäre auch sehr sinnvoll für das Bewegen im Internet!

Zäune mögen am Anfang (bei den ersten Schritten) gut sein, aber das Ziel sollte ein anderes sein! Unsere Kinder brauchen einen wachsenden Freiraum, Entscheidungen selbst treffen zu können. Nur so lernen Sie aus ihren Erfahrungen und Fehlern. .... Fehler, vor denen wir sie am liebsten beschützen würden! Doch ist unser Schutz-Trieb ;-) zu groß, dann engen wir sie ein.

Wichtig dabei ist immer auch eine vertrauensvolle Beziehung, in der Kinder mit allem (Erfolge UND Versagen) zu ihren Eltern kommen können, ohne dass sie (im Falle von Versagen) einen Kopf kürzer gemacht werden.

Und noch etwas: Wenn wir uns wünschen, dass Kinder sich verändern oder bestimmte Dinge lernen, dann müssen wir Eltern uns an der Nase nehmen und uns fragen: "Wo verhindere ich mit meinem Leben, dass mein Kind sich verändern kann?" Ich habe erlebt, dass eine Veränderung meiner selbst, die beste Basis für eine Veränderung meiner Kinder ist! Ich kann meinem Kind versuchen vieles einzubleuen ... letztenendes spricht mein Leben um vieles lauter als meine Worte!

Achja: Der Titel ScreenShots wegen der "lieben" Kleinen... passt meiner Ansicht nicht mehr so ganz zu einem 13 Jährigen!

cu,
guido
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: ScreenShots wegen der "lieben" Kleinen...

Beitrag von Kaeru Gaman »

@helpy :allright:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Little John

Re: ScreenShots wegen der "lieben" Kleinen...

Beitrag von Little John »

Kaeru Gaman hat geschrieben:@helpy :allright:
Wollte ich auch gerade sagen ...
+ 1
netzcoder
Beiträge: 275
Registriert: 27.08.2009 14:14
Computerausstattung: Intel Quad Core 2.5 GHz; 8GB DDR2 RAM; NVIDIA GeForce GT 130 mit 1500 MB; 2TB HDD;
Kontaktdaten:

Re: ScreenShots wegen der "lieben" Kleinen...

Beitrag von netzcoder »

Er hat ja hier nicht gesagt das er meint es wäre die perfekt Möglichkeit und er hat auch nicht gefragt was die beste ist, er wollte nur kurz sein Script posten.
PB 4.40 Final Full Version
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: ScreenShots wegen der "lieben" Kleinen...

Beitrag von helpy »

netzcoder hat geschrieben:Er hat ja hier nicht gesagt das er meint es wäre die perfekt Möglichkeit und er hat auch nicht gefragt was die beste ist, er wollte nur kurz sein Script posten.
Das mit der Überwachung KANN ein Anfang sein ... sollte aber meiner Ansicht in Rücksprache mit dem Sohn bzw. mit der Tochter erfolgen.

Ich habe meine Gedanken dazu geschrieben, weil ich ja selbst in der Situation war/bin! ... und da hatte ich gemerkt, wie schnell man dahin kommt, das eigene Kind zu überwachen. Das tut der Beziehung zu meinem Sohn überhaupt nicht gut! Deshalb wollte ich das zu bedenken geben.

Beim Programmieren geht es meiner Ansicht nach nicht nur um eine programm-technische Lösung einer Aufgabenstellung! Manchmal gibt es einfach auch Lösungen, die einem das Programmieren ersparen ;-)

lg,
guido
Windows 10
PB Last Final / (Sometimes testing Beta versions)
netzcoder
Beiträge: 275
Registriert: 27.08.2009 14:14
Computerausstattung: Intel Quad Core 2.5 GHz; 8GB DDR2 RAM; NVIDIA GeForce GT 130 mit 1500 MB; 2TB HDD;
Kontaktdaten:

Re: ScreenShots wegen der "lieben" Kleinen...

Beitrag von netzcoder »

Jo! Wir sind hier aber nunmal ein Programmierforum und kein Erziehungsforum. Und das ganze heißt hier Anwendungen. Und dazu soll man Feedback geben, nicht zu der Art und Weise wie man seinen Sohn überwacht. Wie man seine Kinder erzieht ist jedem selbst überlassen! Naja wenn der 13 Jährige etwas drauf hat lässt er A keien an seinen PC und B packt er das Programmier wieder runter :D
PB 4.40 Final Full Version
Antworten