Mit B+ erstelltes Programm schmeißt dauernd Controller raus
Übersicht BlitzBasic BlitzPlus
SereyanneBetreff: Mit B+ erstelltes Programm schmeißt dauernd Controller raus |
Di, Jan 18, 2022 18:57 Antworten mit Zitat |
|
---|---|---|
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 |
Mi, Jan 19, 2022 17:43 Antworten mit Zitat |
|
---|---|---|
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 |
Mi, Jan 19, 2022 18:44 Antworten mit Zitat |
|
---|---|---|
Vielen lieben Dank für deine Antwort!
Eingeproggt hat Folgendes geschrieben: Lang, lang ist's her *Nostalgie*
Haha, da sagst du was! 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! ) 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. |
||
Übersicht BlitzBasic BlitzPlus
Powered by phpBB © 2001 - 2006, phpBB Group