Witam.
Mam dzisiaj dość nietypowy problem. Pisze pewien program, i w ramach testu pewnego modułu program miął wpisywać kombinacje liczb od 0 do 9999, symulując wciśniecie klawiszy na klawiaturze. Z kodem jako takim nie ma problemu, jednak przy tysięczno którymś powtórzeniu program się "krzyczy". Nie mam pojęcia czemu (sprawdzany na 3 komputerach z czego na jednym podobno działa dobrze O.o)
a oto kod źródłowy (przepraszam za jego długość ale nie miałem pomysłu jak go skrócić. Kod opisałem komentarzami) :
#include <iostream.h>
#include <windows.h>
#include <conio.h>
void wcisnij_zero(int x = 0) //funkcja imitujaca wcisniecie klawisza
{ //zera okreslona ilosc razy (aby zachowac zapis 0001 (...) )
for(int k = 0; k<x;k++)
{
keybd_event(VK_NUMPAD0, 0, 0, 0);
keybd_event(VK_NUMPAD0, 0, KEYEVENTF_KEYUP, 0);
}
}
void wcisnij_enter(int x = 0) //analogicznie dla entera
{
for(int k = 0;k<x;k++)
{
keybd_event(VK_RETURN, 0, 0, 0);
keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
}
}
inline void wcisnij_cyfre(int cyfra) // a tutaj funkcja imitujaca wcisniecie okreslonych cyfr
{
char tabl[5]; //tablica jako bufor dla itoa()
for(int test = 0; test<5; test++) // dla pewnosci zerowanie elementow tablicy
{
tabl[test] = NULL;
}
char *wsk = itoa(cyfra, tabl, 10); // wywolanie funkcji i przypisanie zwroconej wartosci do wskaznika
for(int w = 0; w<5; w++) // "rozklad" liczby na cyfry, i symulacja wcisniecia ich na klawiaturze
{
if(tabl[w] != NULL)
{
switch(tabl[w]) // aby bylo prosciej gotowe makra dla odpowiednich wartosci
{
case '0':
keybd_event(VK_NUMPAD0, 0, 0, 0);
keybd_event(VK_NUMPAD0, 0, KEYEVENTF_KEYUP, 0);
break;
case '1':
keybd_event(VK_NUMPAD1, 0, 0, 0);
keybd_event(VK_NUMPAD1, 0, KEYEVENTF_KEYUP, 0);
break;
case '2':
keybd_event(VK_NUMPAD2, 0, 0, 0);
keybd_event(VK_NUMPAD2, 0, KEYEVENTF_KEYUP, 0);
break;
case '3':
keybd_event(VK_NUMPAD3, 0, 0, 0);
keybd_event(VK_NUMPAD3, 0, KEYEVENTF_KEYUP, 0);
break;
case '4':
keybd_event(VK_NUMPAD4, 0, 0, 0);
keybd_event(VK_NUMPAD4, 0, KEYEVENTF_KEYUP, 0);
break;
case '5':
keybd_event(VK_NUMPAD5, 0, 0, 0);
keybd_event(VK_NUMPAD5, 0, KEYEVENTF_KEYUP, 0);
break;
case '6':
keybd_event(VK_NUMPAD6, 0, 0, 0);
keybd_event(VK_NUMPAD6, 0, KEYEVENTF_KEYUP, 0);
break;
case '7':
keybd_event(VK_NUMPAD7, 0, 0, 0);
keybd_event(VK_NUMPAD7, 0, KEYEVENTF_KEYUP, 0);
break;
case '8':
keybd_event(VK_NUMPAD8, 0, 0, 0);
keybd_event(VK_NUMPAD8, 0, KEYEVENTF_KEYUP, 0);
break;
case '9':
keybd_event(VK_NUMPAD9, 0, 0, 0);
keybd_event(VK_NUMPAD9, 0, KEYEVENTF_KEYUP, 0);
break;
}
}
}
}
main()
{
int i = 0; // zmienna dla petli, i jako liczba wysylana do funkcji
Sleep(10000); // zatrzymanie dzialania programu na 10sek, aby mozna bylo przygotowac dowolny edytor tekstu :)
while(i<10000)
{
if(i<10) // jesli liczba jest mniejsza od 10 wywolanie odpowiednich funkcji
{ // majacych zachowac zapis 0001 itp
wcisnij_zero(3);
wcisnij_cyfre(i);
wcisnij_enter(1);
}
else if(i<100) // analogicznie
{
wcisnij_zero(2);
wcisnij_cyfre(i);
wcisnij_enter(1);
}
else if(i<1000) // analogicznie
{
wcisnij_zero(1);
wcisnij_cyfre(i);
wcisnij_enter(1);
}
else if(i<10000) // analogicznie
{
wcisnij_cyfre(i);
wcisnij_enter(1);
}
i++;
}
getch();
}
Prosze o jaką kolwiek wskazuówke co jest nie tak :) Z góry dziękuje i pozdrawiam.
Rezor.