Jeg har sammen med Yates her inde fra fået skabt et ultra simpelt prgram, i C++, der forhindre min computer i at gå på pauseskærm.
Problemet er så bare at det efterlader mig med det her keddelige "cmd vindue".. Det kunne så være ultra sweet hvis man kunne få dette vindue til at minimere sig som et "System tray icon"
Men dette er i Virtual Basic, og programmet er lavet i C++, kan man på en eller anden måde kombinere de to sprog, eller er der en måde man kan gøre det samme i C++
Det skal lige siges at jeg er rimelig jomfruelig inden for C++/VB programering.. men helt sikkert noget jeg skal til at arbejde mere med..
lige en lille sidekommentar. kunne du ikke formatere, og så ligge en ren version af windows ind. på den måde plejer man at slippe for alt det lort der bliver lagt ind fra producentens side. plejer selv normalt at formatere pc'en, hvis jeg køber ny, for at slippe for alt deres crap
Jeg har nogen oplysning på computeren der ik ret gerne skulle falde i andres hænder.. derfor den ekstra sikkerhed.. og derfor kan jeg heller ik bare gensinstallere windows..
dette er tricky, men måske kan jeg komme med et alternativt forslag. Prøv at oprette et nyt projekt, denne gang er det en windows-application du skal vælge i st f console application . I udgangspunbtet laver devC++ så noget kode for dig der gør ddet lettere at komme igang. Denne kode er for så vidt ok, men jeg foreslår at du sletter alt og paster nedenstående. Når programmet starter op, laves et vindue som ikke vises. Dermed opstår heller ike nogen task bar icon/tab. Men der ligger heller ikke noget i systray. Eneste måde at nakke programmet på er så at trykke ctrl+alt+delete og lukke ned derfra.
/* Make the class name into a global variable */ char szClassName[ ] = "WindowsApp";
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
{ HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */
/* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX);
/* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default color as the background of the window */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
/* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0;
/* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Windows App", /* Title Text */ WS_EX_TOOLWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ );
Det kan være nogle af de andre kan addere noget kode der løbende checker om en bestemt application (fremvisningsprogrammet) kører og som sørger for at lukke ned automatisk når det ikke længere kører. Dette ville jo være hamrende genialt. Kræver nok nogen der er meget mere skrap til windows api end jeg er.
Men det kunne nu være sweet hvis jeg kunne få den ned som et system tray ikon.. så er den lidt nemmer og afslutte.. har leget lidt frem og tilbage med koden fra damb.dk ovenover.. men får en del fejlmeddelser desværre.. nogen der kan gennemskue den?
BertelBrander, jeg har forsøgt at gøre dette lidt mere smart: Tænker man kan starte application X via shellexe/createprocess i program Y. Dette giver et handle til application X som application Y løbende kan tjekke. Y kan så lukke sig selv så snart handle til X ikke længere er et handle til en kørende process. Mit problem er at jeg ikke kan finde en API der kan fortælle mig om et handle har at gøre med en kørende proces. Handle som gives ved Shellexe etc er jo ikke et handle der går i NULL når X lukker. Har du ikke et forslag som kan hjælpe videre her?
prøv at se nedenstående kode. Det shellexer Wordpad og tjekker hele tiden om vinduet 'Dokument - WordPad' er aktivt. I det øjeblik du selv lukker Wordpad, så lukker application sgu sig selv ned. Aha! Dette princip kan du jo overføre til din egen application. Jeg ved ikke hvilket program du skal have kørende, men du kan sikkert selv rette navnet i de to linjer i koden nedenfor så de passser på din situation. Nu behøver du jo ikke engang en systray icon. Y.
kode: ###########
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
{ HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */
/* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX);
/* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default color as the background of the window */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
/* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0;
/* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Windows App", /* Title Text */ WS_EX_TOOLWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ );
keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); } /* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam; }
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
{ HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */
/* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX);
/* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default color as the background of the window */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
/* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0;
/* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Windows App", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ );
/* Make the window visible on the screen */ ShowWindow (hwnd, SW_HIDE); MakeTrayIcon(hwnd); //sleep (3000);
Flyvholm=0;
/* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&messages, NULL, 0, 0)) {
/* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); sleep(1000); keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); if (Flyvholm==1) goto out;
} out: RemoveTrayIcon(hwnd); /* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam; }
/* This function is called by the Windows function DispatchMessage() */
if (MessageBox(hwnd, "Press OK for at lukke!", "Uha, chefen kigger over skulderen", MB_OKCANCEL)==IDOK) Flyvholm=1;
} break;
case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); }
OBS: eksemplet ovenfor kræver at du lægger en ikon ind i samme directory som din application. Jeg har her kaldt den for "robin.ico" men du kan jo bare ændre som det passer dig. Hvis du kører eksemplet ovenfor uden at "robin-ico" findes så vises bare en tom ikon i din hylde. Heldigvis virker den stadig efter hensigten. I det øjeblik du klikker på ikonen får du en box hvor du blir bedt om aat bekræfte nedlukning. Hvis du gør dette stopper programmet og screensaver-suppressionen skulle ophøre.
Hvor er i seje.. men ved ik om jeg gør noget forkert.. men jeg kan ik få den til at lukke ned.. dvs at den lukker lidt mærkeligt ned.. efter et stykke tid forsvinder icon´et.. sq svært at forklare hehe
Man kan os åbne programmet flere gange.. på en gang.. men dt kan jo egentlig være lige meget, bare en detalie..
på min computer går der også lidt tid (dog ikke ret meget) før windows faktisk opdaterer systray'en og har fjernet ikonet. Hermed fik vi vist løst dit problem; kampen mod den onde screensaver er vundet.
det hele ser ud til at været gået i stå.. så tæt på at jeg havde et overdrevet fedt resultat.. plz hjælp mig med det sidste.. Virker det hos jer.. hos mig virker det ikke når den minimere sig..
beklager jeg har været på ferie i flere uger. Jeg er ikke sikker på jeg ved hvad der kan være galt. Beklager så må du nok gå tilbage til modellen som skulle lukkes manuelt via Ctrl+Alt+Delete. Y.
/* Make the class name into a global variable */ char szClassName[ ] = "WindowsApp";
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE, LPSTR, int) { HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */
/* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX);
/* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */
/* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0;
/* The class is registered, let's create the program*/ hwnd = CreateWindowEx (0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Windows App", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 100, /* The programs width */ 85, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL); /* No Window Creation data */
/* Make the window visible on the screen */ ShowWindow (hwnd, SW_SHOW);
/* Run the message loop. It will run until GetMessage() returns 0 */ while(GetMessage (&messages, NULL, 0, 0) > 0) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages);
} RemoveTrayIcon(hwnd); /* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam; }
/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK WindowProcedure (HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { case WM_CREATE: CreateWindow("BUTTON", "Enable", WS_CHILD | WS_VISIBLE, 5, 5, 100, 30, hwndDlg, (HMENU)(IDC_BUTTON1), 0, 0); break; case TRAY_MESSAGE: if(lParam == WM_LBUTTONDOWN) { RemoveTrayIcon(hwndDlg); ShowWindow(hwndDlg, SW_SHOW); KillTimer(hwndDlg, IDT_TIMER); } break; case WM_COMMAND: if(HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDC_BUTTON1) { MakeTrayIcon(hwndDlg); ShowWindow(hwndDlg, SW_HIDE); SetTimer(hwndDlg, IDT_TIMER, 1000, 0); } break; case WM_TIMER: keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); break; case WM_DESTROY: PostQuitMessage(0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc(hwndDlg, message, wParam, lParam); } return 0; }
helt sikkert syntes jeg også =P Der er dog lige en ting.. når iconet er i system tray og så man prøver at lukke det er det somom at man "enable´er" det igen? kan man lave det som en start stop knap? -hvis du kan følge mig
Er det svært at lave nogen fancy grafix på start stop knappen? ik noget du skal gå i dybden med hvis det ik bare lige er til. =)
Jeg er ikke sikker på at jeg forstår første del. Vi du have den til at lukke programmet når du trykker på ikonet i tray? Det burde ikke være noget problem.
Man kan godt putte et billede på "Enable" knappen, hvis det er den du tænker på.
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.