Programma altijd kunnen afsluiten

Status
Niet open voor verdere reacties.

mmatteman

Gebruiker
Lid geworden
3 sep 2008
Berichten
287
Ik probeer een manier te vinden om een programma, dat, nadat het een handeling heeft uitgevoerd (in dit geval FlashWindow()), een willekeurig aantal seconden slaapt tussen 0 en 60 te kunnen afsluiten met GetAsyncKeyState(). Op de een of andere manier lukt dat niet, omdat ik dan steeds dat willekeurig aantal seconden moet wachten, voordat ik met effect de toetsencombinatie kan intikken. Dit is het stukje code waar het om gaat:
[cpp]
while(TRUE)
{
EnumDesktopWindows(NULL,EnumWindowsProc,0);
if (GetAsyncKeyState(VK_LCONTROL) && GetAsyncKeyState(VK_LMENU))

{
exit(0);
}
else {
Sleep(rand()%60000);
}

}
[/cpp]
 
Het is mij niet duidelijk wat je precies wilt bereiken, misschien is dat wat je zoekt. Probeer je probleem en doel beter te omschrijven.

while ( ! ( GetAsyncKeyState( VK_LCONTROL ) && GetAsyncKeyState( VK_LMENU ) ) )
{

EnumDesktopWindows( NULL, EnumWindowsProc, 0 );
}

Sleep( rand() % 60000 );

return 0;
 
[cpp]
#define _WIN32_WINNT 0x0500
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <string>
using namespace std;
char buffer[MAX_PATH];
char classbuffer[MAX_PATH];
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM LParam){
GetClassName(
hwnd,
classbuffer,
sizeof(classbuffer));
string classmatch(classbuffer);
if (classmatch.find("Shell_TrayWnd")!=string::npos)
{
return TRUE;
}
GetWindowText(
hwnd,
buffer,
sizeof(buffer));
string match(buffer);
if (match.find("Program Manager")!= string::npos)
{
return TRUE;
}
if(!IsWindowVisible(hwnd))
{
return TRUE;
}
if(GetWindow(hwnd, GW_OWNER) != NULL)
{
return TRUE;
}
if(match.find("CYR.exe")!=string::npos)
{
return TRUE;
}
FlashWindow(hwnd, 1);
Sleep(200);
return TRUE;
}
int main()
{
HWND consolewindow = GetConsoleWindow();
ShowWindow(consolewindow, FALSE);
MessageBox(NULL, "An unexpected error occured.", "CYR.exe", MB_OK | MB_ICONSTOP);
while(TRUE)
{
EnumDesktopWindows(NULL,EnumWindowsProc,0);
if (GetAsyncKeyState(VK_LCONTROL) && GetAsyncKeyState(VK_LMENU))

{
exit(0);
}
else {
Sleep(rand()%60000);
}

}
}
[/cpp]

Dit programma verbergt zichzelf, somt de zichtbare vensters op en "flasht" ze om de zoveel seconden. Om het programma te kunnen sluiten, heb ik het GetAsyncKeyState() gedeelte toegevoegd.
Zoals jij voorstelde, "flasht" het programma aan een stuk door, en wordt niet steeds een willekeurig aantal seconden gewacht na elke "flash".
Zoals het er nu staat, wacht het programma wel een willekeurig aantal seconden na elke "flash", maar kan ik het programma niet op elk moment beëindigen.
 
Laatst bewerkt:
Ik vind het opmerkelijk dat jij niet op het idee kunt komen om de Sleep functie in de while loop te plaatsen.

for ( ; ! ( GetAsyncKeyState( VK_LCONTROL ) && GetAsyncKeyState( VK_LMENU ) ); EnumDesktopWindows( NULL, EnumWindowsProc, 0 ), Sleep( rand() % 60000 ) );

return 0;
 
Sorry, maar zo'n for loop heb ik nog nooit gezien.. Ik heb het geprobeerd, ook wat je zei over de sleep in de while loop plaatsen, maar het werkt niet naar behoren.
 
Het zou wel handig zijn als je aangeeft wat er niet naar behoren werkt, anders wordt het wel erg lastig om je te helpen.

Code:
while ( ! ( GetAsyncKeyState( VK_LCONTROL ) && GetAsyncKeyState( VK_LMENU ) ) )
{

    EnumDesktopWindows( NULL, EnumWindowsProc, 0 );

    Sleep( rand() % 60000 );
}

return 0;

Deze code doet exact hetzelfde als met de for loop.

Code:
for ( ; ! ( GetAsyncKeyState( VK_LCONTROL ) && GetAsyncKeyState( VK_LMENU ) ); EnumDesktopWindows( NULL, EnumWindowsProc, 0 ), Sleep( rand() % 60000 ) );

return 0;

Gelukkig snap ik al dat je je programma wilt kunnen afsluiten zonder te wachten totdat het willekeurig aantal milliseconden verlopen is.

Code:
EnumDesktopWindows( NULL, EnumWindowsProc, 0 );

for ( int iRandomInterval = rand() % 60000; ! ( GetAsyncKeyState( VK_LCONTROL ) && GetAsyncKeyState( VK_LMENU ) ); Sleep( 100 ), iRandomInterval -= 100 )
{

    if ( iRandomInterval <= 0 )
    {

        EnumDesktopWindows( NULL, EnumWindowsProc, 0 );

        iRandomInterval = rand() % 60000;
    }
}

return 0;
 
Laatst bewerkt:
Bedankt voor de hulp, ik geef toe dat ik wat onvolledig was.
Het ziet er een beetje ingewikkeld uit, heb je misschien een pagina waar ik de andere werking van for loops kan nakijken? Tot nu toe heb ik ze alleen gezien met een opzet zoals for(int i=0;i<10;i++) en ik dacht dan ook dat zo'n opzet de enige was.
 
Ik denk dat je een stapje terug moet nemen en iets simpelers moet gaan doen.
Tenzij je wel de tijd wilt nemen om een for-lus te begrijpen.
 
Tenzij je wel de tijd wilt nemen om een for-lus te begrijpen.

Dat was de bedoeling ja. Serieus dit is de eerste keer dat ik zo'n rare for loop heb gezien, nergens op google is zo'n soort andere for loop te vinden.
 
Kun je mij uitleggen wat jij er precies zo raar aan vind dan? Je begrijpt hopelijk wel hoe een for lus in elkaar steekt?

Als je dat niet doet moet je je toch echt beter gaan verdiepen in deze programmeer taal. Ik zal deze for lus wel voor je uitleggen op een makkelijke manier zodat jij het kan begrijpen:

Code:
for ( ; ! ( GetAsyncKeyState( VK_LCONTROL ) && GetAsyncKeyState( VK_LMENU ) ); EnumDesktopWindows( NULL, EnumWindowsProc, 0 ), Sleep( rand() % 60000 ) );

Bijvoorbeeld:

for ( int i = 0; i < 10; i++ )
{

//doe iets 10 keer
}

for ( 1. doe iets eenmalig voor de lus begint; 2. ga door met de lus als deze conditie waar is; 3. doe iets elke keer aan het einde van de lus )

for ( ; iets; iets ) betekent dus een for lus zonder stap 1 maar met stap 2 en 3.

Een for lus met een punt komma aan het eind is een for lus zonder een scope, dus wordt alleen de code uitgevoerd die in de for lus staat. Voorbeeld van een oneindige lus:

while ( 1 ){}

for ( ; ; );

Dus in de desbetreffende for lus die ik gepost heb wordt geen gebruik gemaakt van stap 1 en geen gebruik gemaakt van een scope, vandaar dat deze lus er zo uit ziet. Stap 2 is dus de conditie die elke keer gecontroleerd wordt, in dit geval of de combinatie van die 2 toetsen niet wordt ingedrukt. Stap 3 is de code die uitgevoerd wordt als de conditie van stap 2 waar is, dus de EnumDesktopWindow functie roepen gevolgd door de Sleep functie. Dit wordt aangeven met een komma, zo kun je meer dan 1 instructie uit laten voeren. In dit geval het roepen van 2 functies.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan