Mit B+ erstelltes Programm schmeißt dauernd Controller raus

Übersicht BlitzBasic BlitzPlus

Neue Antwort erstellen

Sereyanne

Betreff: Mit B+ erstelltes Programm schmeißt dauernd Controller raus

BeitragDi, Jan 18, 2022 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute,

ich hab mal vor gefühlt 20 Jahren mit Hilfe dieses Forums ein kleines Programm geschrieben, welches folgende Funktionen hat:

- man kann einen Pfad angeben, aus dem Bilddateien in den Speicher geladen werden
- man kann eine Zeit angeben (zb 10 Sekunden)
- man kann eine Größe angeben (in Pixeln)
-> die geladenen Bilder werden zufällig ausgewählt, angezeigt, auf die gewünschte Größe ge-resized und nach Ablauf der angegebenen Zeit wird das nächste Bild zufällig genommen
- das Programm läuft always on top und kann mittels einem Button in den Tray minimiert werden (wo es dann anhält und in der Zeit keine weiteren Bilder lädt oder anzeigt)

Mir ist klar, dass B+ mittlerweile recht alt ist. Aber bis Win 7 hat alles einwandfrei funktioniert. Seit Dezember hab ich nun Win 10 und jetzt folgendes Problem:

Immer, wenn ein neues Bild angezeigt wird, erklingt von Windows der Ton, wenn ein Gerät ab- und wieder angekoppelt wird, wie wenn man einen USB Stick einsteckt. Dies bezieht sich auf meinen angeschlossenen PS4-Controller, der damit jedes Mal für ca 2 Sekunden deaktiviert wird und mich beim Zocken natürlich extrem nervt.

Meine Frage wäre nun, ob ich irgendwas am Code ändern oder irgendwas anderes tun kann, damit das wieder funktioniert (alternativ: ein anderes Programm, was ebenfalls das Gewünschte tun kann, am besten kostenlos).

Hier der Code:

Code: [AUSKLAPPEN]
;LÄUFT MIT ZUFALLSGENERATOR
;BILDER WERDEN PER RESIZE AUFS KLEINE CANVAS ANGEPASST (FENSTER KANN NICHT VERGRÖßERT WERDEN)
;PFAD KANN VOM USER SELBST ANGEPASST WERDEN
;SHOW HÄLT AN WENN IM HIDE
;FENSTER IST ALWAYS ON TOP
;DEBUGS SIND AUSKOMMENTIERT

desktophoehe=ClientHeight(Desktop())
desktopbreite=ClientWidth(Desktop())
;clientheight und -width ermittelt die Bildschirmauflösung

SeedRnd MilliSecs () ;Zufallsgenerator starten

Local cAppDir$=CurrentDir$() ;für Icon

Global cIconStart$=cAppDir$+"usergrp.ico"

;create a window
Global parentwindow=CreateWindow("Extra",0,0,0,0,Desktop()) ;damit in der Taskleiste nix angezeigt wird, childfenster anhängen
MaximizeWindow parentwindow
fensterhoehe=GadgetHeight(parentwindow)
taskleiste=desktophoehe-fensterhoehe+20 ;+16 wegen Berücksichtigung des Randes und nochmal +4 als Toleranz
;DebugLog "desktop "+desktopbreite+" x "+desktophoehe
;DebugLog "fenster "+fensterhoehe
;DebugLog "task "+taskleiste

Global trayWnd=CreateWindow("DiaShow",0,0,0,0,parentwindow,1) ;childfenster
;Werte abziehen, um die Bildschirmecke zu treffen
;die hintere 1 = Fenster kann nicht minimiert, vergrößert, verkleinert werden, sonst 3

HideGadget parentwindow

hWnd = GetActiveWindow()
USER32_SetWindowPos(hWnd,-1,0,0,0,0,$1+$2) ;Always on top

hide=CreateButton("hide",0,0,0,0,trayWnd)


;Einen Dim erstellen mit max 500 Einträgen
Dim pic$(500)

If FileType ("pfad.txt")=0 Then ;ermittelt, ob eine bestimmte Datei existiert, falls nicht,
   FensterFrage=CreateWindow("DiaShow",desktopbreite/2-150,desktophoehe/2-150,300,240,Desktop(),1) ;Abfrage der gewünschten Daten: Breite, Höhe, Intervall
   Abfrage=CreateLabel("Gib die gewünschte Größe ein:",50,30,200,20,FensterFrage)
   breiteAbfrage=CreateTextField(40,60,50,20,FensterFrage)
   hoeheAbfrage=CreateTextField(170,60,50,20,FensterFrage)
   textbreite=CreateLabel("Breite",100,60,30,20,FensterFrage)
   texthoehe=CreateLabel("Höhe",230,60,30,20,FensterFrage)
   intervalltext=CreateLabel("Intervall:",50,110,40,20,FensterFrage)
   intervall=CreateTextField(100,110,50,20,FensterFrage)
   sekuden=CreateLabel("Sekunden",160,110,50,20,FensterFrage)
   okAbfrage=CreateButton("OK",120,160,60,40,FensterFrage)
      
   Repeat
   WaitEvent
      Select EventID()
      Case $803 ;WindowClose
         End
      Case $401: ;GadgetAction, Eingabe   
         If EventSource() = okAbfrage Then
            gewaehlteBreite=TextFieldText$(breiteAbfrage)
            gewaehlteHoehe=TextFieldText$(hoeheAbfrage)
            gewaehltesIntervall#=TextFieldText$(intervall)
            HideGadget FensterFrage
            Goto fortsetzen            
         EndIf
      End Select
      Forever
   End
      
.fortsetzen
userpfad$=RequestDir$()
   If userpfad$="" Then End
   save=WriteFile("pfad.txt") ;erstellt eine Datei für einen Schreibzugriff
      WriteLine save,userpfad$ ;Dieser Dateibefehl speichert den Pfad in eine Datei
      WriteLine save,gewaehlteBreite
      WriteLine save,gewaehlteHoehe
      WriteLine save,gewaehltesIntervall
ElseIf FileType ("pfad.txt")=1 Then ;falls die Datei existiert
   save=ReadFile ("pfad.txt")
   userpfad$=ReadLine$(save)
   gewaehlteBreite=ReadLine$(save)
   gewaehlteHoehe=ReadLine$(save)
   gewaehltesIntervall=ReadLine$(save)
EndIf

CloseFile(save)

neueBreiteStart=desktopbreite-gewaehlteBreite-8
neueHoeheStart=desktophoehe-gewaehlteHoehe-60-taskleiste

SetGadgetShape trayWnd,neueBreiteStart,neueHoeheStart,gewaehlteBreite+8,gewaehlteHoehe+60
canvas=CreateCanvas(0,0,gewaehlteBreite,gewaehlteHoehe,trayWnd)
SetGadgetShape hide,(gewaehlteBreite+8)/2-100,gewaehlteHoehe+60-20-35,200,20


;DebugLog userpfad$

;Pfad festlegen
bpfad$=userpfad$+"\"
;Verzeichnis einlesen, sodass wir nacher mit nextfile die Dateien/Verzeichnisse ausgeben können die
;dort drin sind
Verz = ReadDir(bpfad$)

;DebugLog "LESE FILES!"
;DebugLog "bpfad="+bpfad$

; show the initial icon
ggTrayCreate(QueryObject(trayWnd,1))
   
; set the icon
ggTraySetIconFromFile(cIconStart$)
   
; show the icon with the updated text
ggTrayShowIcon()

Repeat ;schleifen anfang
   ;So jetzt lesen wir die Daten im Ordner aus
   Datei$ = NextFile$(Verz)
   typ$ = Lower$(Right$(Datei$,3))
   ;wandelt die drei Zeichen auf der rechten Seite der Datei in Kleinbuchstaben (also das *.jpg)
   If Datei$ = "" Then Exit ;Falls es keine Files mehr hat (also Netxfile() nichts zurückgab
   ;sind wir also fertig -> schleife verlassen mit exit
   If FileType(bpfad$+ Datei$)=1 And (typ$="jpg" Or typ$="png" Or typ$="bmp") Then
      ;Filetype liefert 0/1/2 zurück, wenn es 1 ist war es eine Datei (und kein Ordner)
      ;Format wird geprüft, damit es keinen Fehler bei z. B. Thumbs gibt
      pic$(i)=bpfad$+Datei$ ;Pfad also C:\Users\blabla\ und die Variable Datei$ (die wir ausgelesen
                     ;haben, also zmb lol.jpg) in den Dim speichern
   ;DebugLog pic$(i) ;ausgeben zur kontrolle (dort wird dann was wie C:\Users\blabla\lol.jpg sthen
     i=i+1 ;Index erhöhen, also den ersten Pfad den wir eingelesen haben können wir mit pic$(1)
            ;ausgeben
   ;DebugLog "i="+i
    End If
Forever ;für immer wiederholen -> oder per exit, siehe oben

CloseDir Verz ;da wir alles ausgelesen haben, können wir es jetzt wieder schön schließen

SetBuffer CanvasBuffer (canvas)

;Abfrage ob Intervall größer oder kleiner 1 und anschließende Umrechnung
If gewaehltesIntervall#<1 Then neuerTimer#=1
If gewaehltesIntervall#>=1 Then neuerTimer#=gewaehltesIntervall#/(gewaehltesIntervall#*gewaehltesIntervall#) ;Intervall:(Intervall x Intervall) = Bsp 4:(4x4) = 0,25 = ein Bild für 4 Sekunden

timer = CreateTimer(neuerTimer#) ; war auf 0.1 ---> 0.1 Schläge pro Sekunde --> 1 Schlag alle 10 Sekunden
max=i ;Der Wert von I ist gleich wieviele Bilder wir eingelesen haben (siehe oben) den
   ;speichern wir jetzt in Max nur der Übersicht halber
;DebugLog "i="+i
;DebugLog "max="+max
counter=0
halt=0 ;soll anhalten wenn im hide

Repeat
   WaitEvent

      Select EventID()
      Case $803 ;WindowClose
         End
      Case $401: ;GadgetAction, Eingabe   
         If EventSource() = hide Then
            HideGadget trayWnd
            halt=1
         EndIf
      Case $4001 ;Timer Event

;anmerkung, wir haben jetzt ja den Dim namens Pic$ welcher die Pfade zu den Bildern enthält, nun
;müssen wir ja alle durchgehen, also den eintrag 1 von Pic, den eintrag 2 usw
;das übernimmt unsere Variable Counter, welche sich um eins erhöht bis er grösser wird als max
;(also mehr als alle Bilder die wir reingeladen haben)
;nun würden wir eine Fehlermeldung bekommen, da pic$(eine zahl zu groß) leer wäre und bei Loadimage
;einen Mist laden, und spätestens bei DrawImage nen Fehler werfen würde
      If halt=0 ;nur anzeigen wenn nicht im hide
         counter=Rand(0,max-1) ;zufälliges Bild laden, nicht so groß wie max, da sonst Fehler
         If counter=letztesBild Then counter=Rand(0,max-1) ;nicht zweimal hintereinander
         ;das gleiche Bild anzeigen
         If temp<>0 Then FreeImage (temp)  ;Weil wir alle Bilder unter dem Namen temp speichern, schauen
         ;wir ob wir schon ein Bild geladen haben, wenn dem so ist, löschen wir es und laden dann das nächste
         temp=LoadImage (pic$(counter)) ;Pfad aus dem Dim verwenden, nämlich den Eintrag mit dem Wert counter
         ;DebugLog "HABE GELADEN:" ;Details ausgeben
         ;DebugLog pic$(counter)
         ;DebugLog "temp="+temp
         ;DebugLog "i="+i
         ;DebugLog "max="+max
         ;DebugLog "counter="+counter
         Cls ;Clearscreen, weil wir sonst die Bilder übereinander zeichnen
         bildhoehe=ImageHeight(temp)
         bildbreite=ImageWidth(temp)
         ;DebugLog "bildhöhe: "+bildhoehe
         ;DebugLog "bildbreite: "+bildbreite
         If bildhoehe<bildbreite Then ;checke ob Bild höher als breit, sonst verzerrt
               ResizeImage temp,gewaehlteBreite,gewaehlteHoehe ;wenn breiter als hoch, resize
               DrawImage temp,0,0 ;So jetzt können wir zeichnen
            Else ;wenn höher als breit, scale
            ;------------- SCALE BEFEHL RAUSGENOMMEN --------------
               ;ScaleImage temp,0.5,0.5 ;Faktor um den skaliert werden soll
               ;neuehoehe=ImageHeight(temp)
               ;neuebreite=ImageWidth(temp)
               ;DebugLog "neuebildhöhe: "+neuehoehe
               ;DebugLog "neuebildbreite: "+neuebreite
               ;DrawImage temp,96-neuebreite/2,70-neuehoehe/2 ;So jetzt können wir zeichnen - Bild ab der Häfte des Fensters beginnen, damit es zentriert wird
            ;-------------- ENDE --------------------------- die beiden unten stehenden löschen, wenn wieder Scale verwendet werden soll!
               ResizeImage temp,gewaehlteBreite,gewaehlteHoehe
               DrawImage temp,0,0
         EndIf   
         letztesBild=counter
      EndIf
      End Select

FlipCanvas canvas

; check for a left doubleclick
If ggTrayPeekLeftDblClick()>0
   ; check the tooltip to see what status we are currently at
   If Instr(ggTrayGetToolTip(),"Stopped")>0
      ; set the icon
      ggTraySetIconFromFile(cIconStart$)
                        
   Else
      ; set the icon
      ggTraySetIconFromFile(cIconStop$)
      halt=0         
   EndIf
         
   ; TODO: show your menu here at the event mousex,mousey
   ShowGadget trayWnd

   ; clear out the events
   ggTrayClearEvents()
EndIf
   
; check for a right click
If  ggTrayPeekRightClick()>0
   Exit
EndIf

Forever

; clean up the tray
ggTrayDestroy()   

; free the invisible tray window
FreeGadget trayWnd   

End

Eingeproggt

BeitragMi, Jan 19, 2022 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Lang, lang ist's her *Nostalgie*
Wenn das auf Win 10 überhaupt noch läuft ist es schon fast ein Wunder.

Mögliche "Schuldige":
1.) DirectX / DirectPlay und was Blitz noch so alles verwendet - und was mittlerweile veraltet ist. Da kannst du fürchte ich nicht viel tun wenn es daran liegt.
2.) "ggTray" war meiner Erinnerung eine lib / decls... Kannst du mal probieren dein Programm OHNE ggTray funktionen zu benutzen? Einfach um zu sehen ob das Problem dann noch auftritt?

Als Alternativen fällt mir nicht direkt ein Tool ein auf das man verweisen kann. Aber es sollte "relativ" einfach sein, diese Funktionalität in anderen Sprachen nachzubauen. Ich habe das meiste meiner BB-Tools auf Linux einfach mit der Shell nachgebaut. Auf Windows vielleicht Python?
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Sereyanne

BeitragMi, Jan 19, 2022 18:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen lieben Dank für deine Antwort!

Eingeproggt hat Folgendes geschrieben:
Lang, lang ist's her *Nostalgie*

Haha, da sagst du was! Laughing
Ich kann mich sogar noch an deinen Namen und Avatar erinnern - schön, dass es dich noch gibt!

Eingeproggt hat Folgendes geschrieben:
Wenn das auf Win 10 überhaupt noch läuft ist es schon fast ein Wunder.

Wie gesagt, das tut es, es haut mir nur alle paar Sekunden den Controller raus.

Eingeproggt hat Folgendes geschrieben:
2.) "ggTray" war meiner Erinnerung eine lib / decls... Kannst du mal probieren dein Programm OHNE ggTray funktionen zu benutzen? Einfach um zu sehen ob das Problem dann noch auftritt?

Ja genau, ist eine decls.
Hab jetzt mal alles, was meiner Meinung damit zusammenhängt (ist wirklich lange her! Wink ) auskommentiert. Wenn ich es jetzt teste, kriege ich einen "Invalid Gadget handle" Fehler.

Eingeproggt hat Folgendes geschrieben:
Aber es sollte "relativ" einfach sein, diese Funktionalität in anderen Sprachen nachzubauen. Ich habe das meiste meiner BB-Tools auf Linux einfach mit der Shell nachgebaut. Auf Windows vielleicht Python?

Ich beherrsche leider keine anderen Programmiersprachen und selbst BB hab ich nie wirklich "beherrscht" (obiges Programm kam ja nur mithilfe dieses Forums überhaupt zustande). Mir ist auch klar, dass niemand hier Lust haben wird, "mal eben" so ein Programm für jemand Unbekannten zu programmieren (wobei ich auch durchaus bereit wäre, ein paar Euro für die Hilfe springen zu lassen).
Schade, dass BB so in der Versenkung verschwunden ist. Hat mir damals schon Spaß gemacht.

In der Zwischenzeit hab ich ein Programm gefunden, was sogar mehr kann, als ich will (Artsee), es hat nur leider die Hide-Funktion nicht, was natürlich schade ist.

Neue Antwort erstellen


Übersicht BlitzBasic BlitzPlus

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group