Descartes
Unregistrierter
|
Descartes Unregistrierter
16:17:00 06.04.2002 Titel: |
|
Zitieren |
Unter welchem Betriebssystem ?
Ich gehe mal davon aus, du meinst Windows ;-)
Zum Themas Bildschirmschoner unter Windows gab es hier im Forum schon mal einen Thread. Da ich die URL nicht mehr habe poste ich das ganze einfach noch einmal:
Das Programmieren von Screensavern ist eingentlich recht einfach. Theoretisch kann man jede Exe in Scr umbennen und voila, man hat einen ScreeS.. Das Problem ist nur, daß bestimmte Sachen, wie VollbildWindow oder das automatische Schließen bei Mausbewegungen, nicht unterstützt werden (es sei denn, man schreibt den Code dafür). Das elegantere und einfachere Verfahren ist, sich von VC6 das Grundgerüst basteln zu lassen.
1. Normale WinApi Anwendung erstellen.
2. Bei den Linker- und Debugereinstellungen den Namen der Endatei von exe auf scr ändern.
3. scrnsave.lib dem Projekt hinzufügen
4. windows.h und scrnsave.h "includen".
Ein Screensaver besteht grundlegend aus 3 Funktionen:
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 | 1 2 3 4 5 6 7 8 9 10 11 | long WINAPI ScreenSaverProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam);
BOOL WINAPI ScreenSaverConfigureDialog(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam);
BOOL WINAPI RegisterDialogClasses(HANDLE hInst); | |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 | long WINAPI ScreenSaverProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam);
BOOL WINAPI ScreenSaverConfigureDialog(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam);
BOOL WINAPI RegisterDialogClasses(HANDLE hInst); | |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 | long WINAPI ScreenSaverProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam);
BOOL WINAPI ScreenSaverConfigureDialog(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam);
BOOL WINAPI RegisterDialogClasses(HANDLE hInst); | |
Ihre Namen lassen schon auf den Zweck schließen. So, das war das Grundwissen, jetzt schreiben wir am besten ein komplettes Gerüst um zu sehen, wie's denn funktioniert.
Normale Api-Programme verfügen über die Funktion WindowProc() bei ScreenSaver heißt diese Funktion ScreenSaverProc(). Von ihr wird, wie auch bei der WindowProc(), das MessageHandling übernommen.
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | long WINAPI ScreenSaverProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_CREATE:
// Initialisierung
// und erstellen eines Timers
break;
case WM_TIMER:
// Hier stehen norm. die Grafikfunktionen
break;
case WM_DESTROY:
// Speicher frei machen und Fenster schließen
break;
}
return DefScreenSaverProc(hWnd,message,wParam,lParam);
} | |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | long WINAPI ScreenSaverProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_CREATE:
// Initialisierung
// und erstellen eines Timers
break;
case WM_TIMER:
// Hier stehen norm. die Grafikfunktionen
break;
case WM_DESTROY:
// Speicher frei machen und Fenster schließen
break;
}
return DefScreenSaverProc(hWnd,message,wParam,lParam);
} | |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | long WINAPI ScreenSaverProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_CREATE:
// Initialisierung
// und erstellen eines Timers
break;
case WM_TIMER:
// Hier stehen norm. die Grafikfunktionen
break;
case WM_DESTROY:
// Speicher frei machen und Fenster schließen
break;
}
return DefScreenSaverProc(hWnd,message,wParam,lParam);
} | |
Das würde für einen kleinen Screensaver reichen, aber wir haben noch keinen Konfigurationsdialog eingerichtet. Der kann unabhängig von der ScreenSaverProc() aufgerufen werden.
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | BOOL WINAPI ScreenSaverConfigureDialog(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
// Initialisierung
return TRUE;
case WM_COMMAND:
// Handling von Befehlen
break;
case WM_CLOSE:
// Schließen des Fensters und evtl. Speicher freimachen
return TRUE;
}
return FALSE;
} | |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | BOOL WINAPI ScreenSaverConfigureDialog(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
// Initialisierung
return TRUE;
case WM_COMMAND:
// Handling von Befehlen
break;
case WM_CLOSE:
// Schließen des Fensters und evtl. Speicher freimachen
return TRUE;
}
return FALSE;
} | |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | BOOL WINAPI ScreenSaverConfigureDialog(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
// Initialisierung
return TRUE;
case WM_COMMAND:
// Handling von Befehlen
break;
case WM_CLOSE:
// Schließen des Fensters und evtl. Speicher freimachen
return TRUE;
}
return FALSE;
} | |
Für den Dialog brauchen wir natürlich eine Dialog-Resource. Die muß aber als 2003 in der resource.h definiert sein: also: #define DLG_SCRNSAVECONFIGURE 2003). Ach ja, man muß natürlich resource.h includen.
Zu guter letzt brauchen wir noch eine Funktion, um spezielle Fensterklassen für den Konfigurationsdialog zu deklarieren.
| C/C++ Code: | BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
{
return TRUE;
} | |
| C/C++ Code: | BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
{
return TRUE;
} | |
| C/C++ Code: | BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
{
return TRUE;
} | |
da wird diese Funktion aber fast nie brauchen, können wir sie leer lassen. ACHTUNG: SIE muß aber auf jeden Fall vorhanden sein.
Jo, das wars auch schon, eigentlich ganz easy. Damit ihr das auch mal an einem echten Beispiel sehen könnt, ist hier der komplette Sourcecode von einem Saver:
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | /* minimaler Bildschirmschoner fuer Windows
*
* kompilieren mit:
* cl -GX main.cpp /link scrnsave.lib /link user32.lib /link gdi32.lib /link advapi32.lib
*
* scrnsave.lib
* wegen scrnsave.h
* user32.lib
* GetForegroundWindow
* IsWindow
* SystemParametersInfoA
* GetCursorPos
* DefWindowProcA
* SetCursor
* PostMessageA
* GetParent
* PostQuitMessage
* DispatchMessageA
* TranslateMessage
* GetMessageA
* CreateWindowExA
* RegisterClassA
* RegisterWindowMessageA
* SetForegroundWindow
* FindWindowA
* GetClientRect
* LoadIconA
* DialogBoxA
* DialogBoxParamA
* SendMessageA
* PeekMessageA
* CharNextA
* gdi32.lib
* GetClibBox
* GetStockObject
* advapi32.lib
* RegCloseKey
* RegQueryValueExA
* RegOpenKey
*/
#include <windows.h>
#include <scrnsave.h>
UINT timer_id;
int r, g, b = 50;
long WINAPI ScreenSaverProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
HDC dc;
dc = GetDC(hWnd);
char hallo[] = "Hallo Welt";
switch(message)
{
case WM_CREATE:
SetTimer(hWnd,timer_id,100,NULL);
break;
case WM_TIMER:
SetBkColor(dc,RGB(0,0,0));
SetTextColor(dc,RGB(r,g,b));
TextOut(dc,300,250,hallo,strlen(hallo));
r = r+5;
b = b+10;
g = g+2;
break;
case WM_DESTROY:
KillTimer(hWnd,timer_id);
ReleaseDC(hWnd,dc);
break;
}
return DefScreenSaverProc(hWnd,message,wParam,lParam);
}
BOOL WINAPI ScreenSaverConfigureDialog(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
EndDialog(hWnd,0);
return TRUE;
case IDCANCEL:
EndDialog(hWnd,0);
return FALSE;
}
break;
case WM_CLOSE:
EndDialog(hWnd,0);
return TRUE;
}
return FALSE;
}
BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
{
return TRUE;
} | |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | /* minimaler Bildschirmschoner fuer Windows
*
* kompilieren mit:
* cl -GX main.cpp /link scrnsave.lib /link user32.lib /link gdi32.lib /link advapi32.lib
*
* scrnsave.lib
* wegen scrnsave.h
* user32.lib
* GetForegroundWindow
* IsWindow
* SystemParametersInfoA
* GetCursorPos
* DefWindowProcA
* SetCursor
* PostMessageA
* GetParent
* PostQuitMessage
* DispatchMessageA
* TranslateMessage
* GetMessageA
* CreateWindowExA
* RegisterClassA
* RegisterWindowMessageA
* SetForegroundWindow
* FindWindowA
* GetClientRect
* LoadIconA
* DialogBoxA
* DialogBoxParamA
* SendMessageA
* PeekMessageA
* CharNextA
* gdi32.lib
* GetClibBox
* GetStockObject
* advapi32.lib
* RegCloseKey
* RegQueryValueExA
* RegOpenKey
*/
#include <windows.h>
#include <scrnsave.h>
UINT timer_id;
int r, g, b = 50;
long WINAPI ScreenSaverProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
HDC dc;
dc = GetDC(hWnd);
char hallo[] = "Hallo Welt";
switch(message)
{
case WM_CREATE:
SetTimer(hWnd,timer_id,100,NULL);
break;
case WM_TIMER:
SetBkColor(dc,RGB(0,0,0));
SetTextColor(dc,RGB(r,g,b));
TextOut(dc,300,250,hallo,strlen(hallo));
r = r+5;
b = b+10;
g = g+2;
break;
case WM_DESTROY:
KillTimer(hWnd,timer_id);
ReleaseDC(hWnd,dc);
break;
}
return DefScreenSaverProc(hWnd,message,wParam,lParam);
}
BOOL WINAPI ScreenSaverConfigureDialog(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
EndDialog(hWnd,0);
return TRUE;
case IDCANCEL:
EndDialog(hWnd,0);
return FALSE;
}
break;
case WM_CLOSE:
EndDialog(hWnd,0);
return TRUE;
}
return FALSE;
}
BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
{
return TRUE;
} | |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | /* minimaler Bildschirmschoner fuer Windows
*
* kompilieren mit:
* cl -GX main.cpp /link scrnsave.lib /link user32.lib /link gdi32.lib /link advapi32.lib
*
* scrnsave.lib
* wegen scrnsave.h
* user32.lib
* GetForegroundWindow
* IsWindow
* SystemParametersInfoA
* GetCursorPos
* DefWindowProcA
* SetCursor
* PostMessageA
* GetParent
* PostQuitMessage
* DispatchMessageA
* TranslateMessage
* GetMessageA
* CreateWindowExA
* RegisterClassA
* RegisterWindowMessageA
* SetForegroundWindow
* FindWindowA
* GetClientRect
* LoadIconA
* DialogBoxA
* DialogBoxParamA
* SendMessageA
* PeekMessageA
* CharNextA
* gdi32.lib
* GetClibBox
* GetStockObject
* advapi32.lib
* RegCloseKey
* RegQueryValueExA
* RegOpenKey
*/
#include <windows.h>
#include <scrnsave.h>
UINT timer_id;
int r, g, b = 50;
long WINAPI ScreenSaverProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
HDC dc;
dc = GetDC(hWnd);
char hallo[] = "Hallo Welt";
switch(message)
{
case WM_CREATE:
SetTimer(hWnd,timer_id,100,NULL);
break;
case WM_TIMER:
SetBkColor(dc,RGB(0,0,0));
SetTextColor(dc,RGB(r,g,b));
TextOut(dc,300,250,hallo,strlen(hallo));
r = r+5;
b = b+10;
g = g+2;
break;
case WM_DESTROY:
KillTimer(hWnd,timer_id);
ReleaseDC(hWnd,dc);
break;
}
return DefScreenSaverProc(hWnd,message,wParam,lParam);
}
BOOL WINAPI ScreenSaverConfigureDialog(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
EndDialog(hWnd,0);
return TRUE;
case IDCANCEL:
EndDialog(hWnd,0);
return FALSE;
}
break;
case WM_CLOSE:
EndDialog(hWnd,0);
return TRUE;
}
return FALSE;
}
BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
{
return TRUE;
} | |
oder such doch mal in google nach "Screensaver.cpp"/-.c Bildschirmschoner.cpp/-.c
http://www.th-soft.com/en_forum/disc_e_frm.htm
http://www.coastlight.com/ken/visualc/
http://www.crackinguniversity2000.it/Borland_C++Builder_How-To/157169109x/book-index.html
How to Do Windows(32bit) Screensavers in C by Andy Clark
http://dspace.dial.pipex.com/town/square/fc77/hobbies/screen/screen_c32.htm
Sunrise Screensaver Sourcecode
http://www.coastlight.com/ken/visualc/sunrise.htm |
|
|
|