Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Bildschirmschoner springt nicht an

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
steini



Anmeldungsdatum: 17.09.2004
Beiträge: 58

BeitragVerfasst am: 29.02.2012, 10:23    Titel: Bildschirmschoner springt nicht an Antworten mit Zitat

Hallo,
eines vorneweg: Das folgende Problem betrifft sämtliche installierten sowie Windows-eigenen Bildschirmschoner (z.B. "Starfield", "Mystify" etc.), nicht aber die Option "Monitor ausschalten" in den Energieoptionen.

Starte ich das folgende Beispielprogramm im Grafikmodus mit Option -s gui, setzt während der Laufzeit der eingestellte Bildschrimschoner NICHT ein.

Code:
screenres 800,600
DO
SLEEP 30
LOOP UNTIL INKEY$ = CHR$(27)
END


Dabei ist es egal, ob das Programm im Vollbild läuft oder nicht. Das Problem tritt sowohl unter XP als auch Win7 auf, auf verschiedenen Computern. Sobald ich das Programm beende, geht auch der Bildschirmschoner wieder.

Hat jemand eine Lösung parat bzw. könnte mal jemand versuchen, das Problem auf seinem Computer zu reproduzieren? Danke schon mal...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 29.02.2012, 17:04    Titel: Antworten mit Zitat

weil das so in FB gemacht wird:
aus libfb_gfx_win32.c:
Code:
/*:::::*/
int fb_hWin32Init(char *title, int w, int h, int depth, int refresh_rate,
      int flags) {
   OSVERSIONINFO info;
   HMODULE module;
   HANDLE events[2];
   long result;
   int i;

   info.dwOSVersionInfoSize = sizeof(info);
   GetVersionEx(&info);
   fb_win32.version = (info.dwMajorVersion << 8) | info.dwMinorVersion;

   module = GetModuleHandle("USER32");

   for (i = 0; i < sizeof(user32_procs) / sizeof(user32_procs[0]); i++) {
      *user32_procs[i].proc = GetProcAddress(module, user32_procs[i].name);
   }

   if (fb_win32.MonitorFromPoint) {
      POINT pt;
      GetCursorPos(&pt);
      fb_win32.monitor = fb_win32.MonitorFromPoint(pt,
            MONITOR_DEFAULTTONEAREST);
   } else {
      fb_win32.monitor = NULL;
   }

   cursor_shown = TRUE;
   last_mouse_pos.x = 0xFFFF;
   fb_win32.mouse_clip = FALSE;

   if (!fb_win32.TrackMouseEvent) {
      fb_win32.TrackMouseEvent = fb_hTrackMouseEvent;
   }

   SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &screensaver_active, 0);
   SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0);

   fb_win32.hinstance = (HINSTANCE) GetModuleHandle(NULL);
   fb_win32.window_title = title;
   strcpy(fb_win32.window_class, WINDOW_CLASS_PREFIX);
   strncat(fb_win32.window_class, fb_win32.window_title,
         WINDOW_TITLE_SIZE + sizeof(WINDOW_CLASS_PREFIX) - 1);
   fb_win32.w = w;
   fb_win32.h = h;
   fb_win32.depth = depth;
   fb_win32.flags = flags;
   fb_win32.refresh_rate = refresh_rate;
   fb_win32.wndclass.lpfnWndProc = fb_hWin32WinProc;
   fb_win32.wndclass.lpszClassName = fb_win32.window_class;
   fb_win32.wndclass.hInstance = fb_win32.hinstance;
   fb_win32.wndclass.hCursor = LoadCursor(0, IDC_ARROW);
   fb_win32.wndclass.hIcon = LoadIcon(fb_win32.hinstance, "FB_PROGRAM_ICON");
   if (!fb_win32.wndclass.hIcon)
      fb_win32.wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
   fb_win32.wndclass.style = CS_DBLCLKS
         | ((flags & DRIVER_OPENGL) ? 0 : CS_VREDRAW | CS_HREDRAW);
   RegisterClass(&fb_win32.wndclass);

   mouse_buttons = mouse_wheel = 0;
   fb_win32.is_running = TRUE;

   keyconv_clear(&keyconv1);
   keyconv_clear(&keyconv2);

   if (!(flags & DRIVER_OPENGL)) {
      InitializeCriticalSection(&update_lock);
      events[0] = CreateEvent(NULL, FALSE, FALSE, NULL);
#ifdef TARGET_WIN32
      events[1] = (HANDLE)_beginthread(fb_win32.thread, 0, events[0]);
#else
      {
         DWORD dwThreadId;
         events[1] = CreateThread(NULL, 0,
               (LPTHREAD_START_ROUTINE) fb_win32.thread, events[0], 0,
               &dwThreadId);
         DBG_ASSERT(events[1] != INVALID_HANDLE_VALUE);
      }
#endif
      result = WaitForMultipleObjects(2, events, FALSE, INFINITE);
      CloseHandle(events[0]);
      handle = events[1];
      if (result != WAIT_OBJECT_0)
         return -1;

      if (flags & DRIVER_HIGH_PRIORITY)
         SetThreadPriority(handle, THREAD_PRIORITY_ABOVE_NORMAL);
   } else
      handle = NULL;

   return 0;
}


schau dir die zeilen
Code:
   SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &screensaver_active, 0);
   SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0);

an, da wird der screensaver ausgeschlatet, man kann also nicht viel machen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 29.02.2012, 20:38    Titel: Antworten mit Zitat

Hi,
was so abgeschaltet wurde lässt sich auch wieder aktivieren:
Code:
#Include "windows.bi"
ScreenRes 400,200
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, 0 ,0)
Do
  Sleep 30
Loop Until InKey <> ""

So geht der Bildschirmschoner bei mir in win7 wieder.
Was die Abschaltung in der libfb_gfx sonst noch bewirken soll ist mir aber unbekannt mit den Augen rollen
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
steini



Anmeldungsdatum: 17.09.2004
Beiträge: 58

BeitragVerfasst am: 01.03.2012, 13:02    Titel: Antworten mit Zitat

Danke volta, so geht der Bildschirmschone unter XP und Win7 bei mir auch wieder
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
steini



Anmeldungsdatum: 17.09.2004
Beiträge: 58

BeitragVerfasst am: 01.03.2012, 14:09    Titel: Antworten mit Zitat

Halt, zu früh gefreut! weinen

Im Fenster geht es so, im Vollbild minimiert sich jedoch das Programm in die Taskleiste, sobald der Bildschirmschoner einsetzen sollte und ich sehe den Destop - ohne Bildschirmschoner! So soll es natürlich nicht sein.

Hat jemand vielleicht auch dafür eine Lösung?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 01.03.2012, 22:53    Titel: Antworten mit Zitat

Ja, bei mir (Win7) geht bei Vollbild der Bildschirmschoner garnicht an.
Mit diesem Aufruf geht es, es flackert aber beim Start kräftig.
Hier startet der Bildschirmschoner sofort, anders hab ich keine Lösung gefunden.
Code:
#Include "windows.bi"
Dim As Integer b, h, f
ScreenInfo b, h ,f  'Desktop
ScreenRes b, h, f, , 1
SendMessage(GetDesktopWindow(), WM_SYSCOMMAND, SC_SCREENSAVE, 0)
Do
  Sleep 30
Loop Until InKey <> ""
Wird der Bildschirmschoner beendet ist das Prog (minimiert) auf der Taskleiste.
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
steini



Anmeldungsdatum: 17.09.2004
Beiträge: 58

BeitragVerfasst am: 02.03.2012, 11:33    Titel: Antworten mit Zitat

Mit dem Flackern könnte ich ja leben, aber immer wieder das Programm ins Vollbild bringen nervt dann doch etwas. Schade. Trozdem besten Dank für deine Bemühungen. Ich werde das mit dem Bildschirmschoner dann wohl ganz sein lassen, denn unter diesen Umständen verstehe ich so langsam auch, weswegen der standardmäßig deaktiviert ist...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 02.03.2012, 11:37    Titel: Antworten mit Zitat

Du kannst dein eigenes fenster aufmachen und einfach nicht "echten" vollbild-modus sondern nur ein rahmenloses fenster mit der exakten größe des Bildschirms benutzen, dann wird nicht dein kompletter grafikbuffer in luft aufgelöst beim bildschirmschoner weil deine anwendung nicht minimiert wird sondern einfach nur das fenster in den hintergrund rutscht. Mit den normalen freebasic SCREEN fenstern geht das halt nicht.
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 02.03.2012, 12:04    Titel: Antworten mit Zitat

MisterD hat Folgendes geschrieben:
Mit den normalen freebasic SCREEN fenstern geht das halt nicht.
wieso sollte das nicht mit FB gehen?
Code:
#Include "windows.bi"
Dim As Integer b, h, f
ScreenInfo b, h ,f  'Desktop
ScreenRes b, h, f, , 8
? "Dein Fenster"
SendMessage(GetDesktopWindow(), WM_SYSCOMMAND, SC_SCREENSAVE, 0)
Do
  Sleep 30
Loop Until InKey <> ""
Oder meinst du mit dem "normalen freebasic SCREEN fenster" den Vollbildmodus?
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 02.03.2012, 13:15    Titel: Antworten mit Zitat

volta hat Folgendes geschrieben:
Oder meinst du mit dem "normalen freebasic SCREEN fenster" den Vollbildmodus?

Ja, ich glaube, er meint den Vollbildmodus.

Da sich der Vollbildmodus ja anders verhält als gewöhnliche Fenster, hat MisterD ja auch vorgeschlagen, auf den Vollbildmodus zu verzichten, stattdessen ein rahmen-/dekorationsloses Fenster zu verwenden, das genauso groß ist wie die Auflösung des Bildschirms.
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
steini



Anmeldungsdatum: 17.09.2004
Beiträge: 58

BeitragVerfasst am: 02.03.2012, 13:27    Titel: Antworten mit Zitat

@MisterD:
Rahmenloses Fenster wäre grundsätzlich eine Idee, ich bin aber auf eine feste Auflösung von 800x600 angewiesen, die leider nicht der des Desktops entspricht.

Das mit dem Minimieren ist ja so ein grundsätzliches Problem mit Freebasic im Grafik-Vollbild und nervt an diversen Stellen. Es tritt ja auch auf, wenn man mit SHELL arbeitet, beispielsweise, um ein paar Dateien im Hintergrund zu kopieren. Es hat mich ein ziemliches Kopfzerbrechen gekostet, externe Programme aus einem Freebasic-Vollbild zu starten und auf die Beendigung zu warten (SHELLEXECUTE wartet nämlich nicht!), ohne dass das Freebasic-Prog beim Aufruf minimiert wird.

Vielleicht gibt es ja eine Möglichkeit, dem automatischen Minimieren irgendwie grundsätzlich einen Riegel vorzuschieben??? Damit wären viele Probleme gelöst...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 02.03.2012, 17:46    Titel: Antworten mit Zitat

steini hat Folgendes geschrieben:
ich bin aber auf eine feste Auflösung von 800x600 angewiesen

Vielleicht hilft dir da WINDOW? Das rechnet dir aber nur die Koordinaten um.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 03.03.2012, 11:28    Titel: Antworten mit Zitat

Ist vielleich nicht das beste, aber so ginge es im vollbildmodus:
Code:
#Include "windows.bi"

Dim As HWND hWnd
Dim Shared As HWND hScreenSaver
Dim Shared As Function(ByVal hWnd As HWND, ByVal msg As UINT, ByVal wParam As WPARAM, lParam As LPARAM) As LRESULT OldWinProc

Function WinProc(ByVal hWnd As HWND, ByVal msg As UINT, ByVal wParam As WPARAM, lParam As LPARAM) As LRESULT
   If(msg=WM_SYSCOMMAND)Then
      If(wParam=SC_SCREENSAVE)Then
         ShowWindow (hWnd, SW_MINIMIZE)
         Sleep 100, 1   ''Wartet, damit auch wirklich das Fenster minimirt ist.
         SendMessage(GetDesktopWindow(), WM_SYSCOMMAND, SC_SCREENSAVE, 0)
         Sleep 1000, 1    ''Wartet, damit auch wirklich das Screensaverfenster vorne ist.
         hScreenSaver = GetTopWindow(NULL)
      EndIf
   EndIf
   Return OldWinProc(hWnd, msg, wParam, lParam)
End Function

ScreenRes 800, 600, 32, ,1
ScreenControl 2, hWnd
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, 0 ,0)
OldWinProc = GetWindowLong(hWnd, GWL_WNDPROC)
SetWindowLong(hWnd, GWL_WNDPROC, @WinProc)

Do
  Sleep 30,1
  If(hScreenSaver)Then
     If(hScreenSaver<>GetTopWindow(NULL))Then
        ShowWindow (hWnd, SW_RESTORE)
        hScreenSaver = 0
     EndIf
  EndIf
Loop Until InKey <> ""

bei mir win 7 ruckelt es halt ein bischen beim beenden des Screensavers.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 03.03.2012, 20:50    Titel: Antworten mit Zitat

Hi XOR,
interessanter Ansatz. Leider funktioniert es ~jedes 3 mal nicht (jedenfalls bei meinem win7), dann sehe ich den BSS nur für Bruchteile einer Sekunde. Zum anderen geht es nur 1x pro Programmaufruf.

Die Warnhinweise des FBC kann man mit ein paar CAST verhindern.
Code:
...
Dim As HWND hWnd
Dim Shared As HWND hScreenSaver
Dim Shared As WNDPROC OldWinProc
...

ScreenControl 2, Cast(Integer,hWnd)
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, 0 ,0)
OldWinProc = Cast(WNDPROC, GetWindowLong(hWnd, GWL_WNDPROC))
SetWindowLong(hWnd, GWL_WNDPROC, CLng(@WinProc))

...

_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz