 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
steini
Anmeldungsdatum: 17.09.2004 Beiträge: 58
|
Verfasst am: 29.02.2012, 10:23 Titel: Bildschirmschoner springt nicht an |
|
|
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 |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 29.02.2012, 17:04 Titel: |
|
|
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 |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 29.02.2012, 20:38 Titel: |
|
|
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  _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
steini
Anmeldungsdatum: 17.09.2004 Beiträge: 58
|
Verfasst am: 01.03.2012, 13:02 Titel: |
|
|
Danke volta, so geht der Bildschirmschone unter XP und Win7 bei mir auch wieder |
|
Nach oben |
|
 |
steini
Anmeldungsdatum: 17.09.2004 Beiträge: 58
|
Verfasst am: 01.03.2012, 14:09 Titel: |
|
|
Halt, zu früh gefreut!
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 |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 01.03.2012, 22:53 Titel: |
|
|
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 |
|
 |
steini
Anmeldungsdatum: 17.09.2004 Beiträge: 58
|
Verfasst am: 02.03.2012, 11:33 Titel: |
|
|
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 |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 02.03.2012, 11:37 Titel: |
|
|
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 |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 02.03.2012, 12:04 Titel: |
|
|
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 |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 02.03.2012, 13:15 Titel: |
|
|
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 |
|
 |
steini
Anmeldungsdatum: 17.09.2004 Beiträge: 58
|
Verfasst am: 02.03.2012, 13:27 Titel: |
|
|
@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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 02.03.2012, 17:46 Titel: |
|
|
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 |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 03.03.2012, 11:28 Titel: |
|
|
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 |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 03.03.2012, 20:50 Titel: |
|
|
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 |
|
 |
|
|
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.
|
|