07. september 2003 - 11:24Der er
21 kommentarer og 1 løsning
Screensaver i Borland C++
Hejsa. Jeg ønsker at lave en screensaver i Borland C++, som skal kunne lukke nogle Win98 maskiner ned. Jeg er MEGET grøn hvad angår C++. Jeg har første del af koden, som når jeg kompilerer den, så ændrer jeg .exe filen til en scr fil. Derefter ligger jeg den ind i system mappen i windows, og vælger den som screensaver. Mit problem er nu, at så snart screensaveren bliver aktiveret, så lukker den ikke windows. Istedet starter den bare en masse commandopromt vinduer. Min kode er som følgende:
Det er delvist rigtigt, at en screensaver 'bare' er en almindelig .exe fil, der er omdøbt til .scr. Men det skal være et Windows program, og ikke et konsol program som det ovenstående.
Du kan lave en screensaver, der kan lukke computeren ned med følgende kode. Du skal linke til scrnsave.lib og comctl32.lib. Jeg har kun testet med MS VC++ 7, men det bør virke på alle nyere compilere, evt. efter lidt tilretninger:
// Screensaver, der lukker maskinen ned efter x antal minutter. //
#include "windows.h" #include "scrnsave.h"
#define TTL_BEFORE_SHUTDOWN 1 // Tid i minutter, før systemet lukkes, mens screensaveren kører. #define SZ_TXT "Tid til nedlukning: " #define SZ_HOURS " timer, " #define SZ_MINS " minutter, og " #define SZ_SECS " sekunder."
// funktion, der kan lukke windows, dur også i NT / XP bool ShutDownSystem(long flag) { OSVERSIONINFO vi ; LUID luid ; HANDLE hProcess, hToken ; long ret = -1 ; DWORD s ; TOKEN_PRIVILEGES tp, tpOld ;
vi.dwOSVersionInfoSize = sizeof(vi) ; GetVersionEx(&vi) ; if ( vi.dwPlatformId == VER_PLATFORM_WIN32_NT ) { // Der køres NT, og vi skal have lavet rettigheder til at lukke systemet ned if ( LookupPrivilegeValue(0,SE_SHUTDOWN_NAME,&luid) ) { hProcess = GetCurrentProcess() ; if ( hProcess ) { if ( OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) ) { tp.PrivilegeCount = 1 ; tp.Privileges->Attributes = SE_PRIVILEGE_ENABLED ; tp.Privileges->Luid.HighPart = luid.HighPart ; tp.Privileges->Luid.LowPart = luid.LowPart ; ret = AdjustTokenPrivileges(hToken, FALSE,&tp,sizeof(tp),&tpOld,&s) ; } CloseHandle(hToken) ; } } }
Jeg får 2 errors, når jeg kompilerer det. Den ene er "static UINT_PTR uTimer = 0;" //Her får jeg Declaration syntax error Den anden er "uTimer = SetTimer(hWnd, 1, 1000, NULL);" // Her diger den Undefined symbol 'uTimer'
Ved du evt. hvad disse er?
Du siger i indledningen at jeg skal linke til scrnsave.lib og comctl32.lib. Hvordan gør jeg det?
arne_v >> Nej, selvfølgelig er det ikke det samme. Men jeg har set begge typer blive brugt til at modtage returværdien fra uTimer. Værdien bliver ikke brugt igen i dette tilfælde, så det burde ikke betyde noget.
mr_wiseguy>> Linker du til scrnsave.lib og comctl32.lib ?
Når du installerer Open Watcom, placeres de 2 filer i lib386\nt. Du kan med fordel prøve at compile screensaveren i Open Watcoms compiler, det er muligt at den uden videre kan compile versionen med notationen: static UINT_PTR uTimer = 0 ; , som er den korrekte måde at gøre det på, som arne_v ganske rigtigt pointerer. Jeg ved ikke hvorfor UINT_PTR ikke er erklæret i Borlands windows.h header.
Hvis jeg kører programmet og inkludere som overstående, så får jeg 2 fejl der hedder : "} expected" Når jeg klikker på disse, så viser den ene at det er USELIB("\Programmer\Borland\CBuilder\LIB\comctl32.lib"); der er noget galt med og den anden siger t det er USELIB("\Programmer\Borland\CBuilder\LIB\scrnsave.lib"); der ikke kører
#define TTL_BEFORE_SHUTDOWN 1 // Tid i minutter, før systemet lukkes, mens screensaveren kører. #define SZ_TXT "Tid til nedlukning: " #define SZ_HOURS " timer, " #define SZ_MINS " minutter, og " #define SZ_SECS " sekunder."
// funktion, der kan lukke windows, dur også i NT / XP bool ShutDownSystem(long flag) { OSVERSIONINFO vi ; LUID luid ; HANDLE hProcess, hToken ; long ret = -1 ; DWORD s ; TOKEN_PRIVILEGES tp, tpOld ;
vi.dwOSVersionInfoSize = sizeof(vi) ; GetVersionEx(&vi) ; if ( vi.dwPlatformId == VER_PLATFORM_WIN32_NT ) { // Der køres NT, og vi skal have lavet rettigheder til at lukke systemet ned if ( LookupPrivilegeValue(0,SE_SHUTDOWN_NAME,&luid) ) { hProcess = GetCurrentProcess() ; if ( hProcess ) { if ( OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) ) { tp.PrivilegeCount = 1 ; tp.Privileges->Attributes = SE_PRIVILEGE_ENABLED ; tp.Privileges->Luid.HighPart = luid.HighPart ; tp.Privileges->Luid.LowPart = luid.LowPart ; ret = AdjustTokenPrivileges(hToken, FALSE,&tp,sizeof(tp),&tpOld,&s) ; } CloseHandle(hToken) ; } } }
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.