Miten voisin toteuttaa seuraavan?
Paina ENTER kun kursori on kohdassa 1... Paina ENTER kun kursori on kohdassa 2... Ensimmäisen kerran kursori oli kohdassa x, y. Toisen kerran kursori oli kohdassa x, y.
Tiedän kyllä, että miten kursorin sijainti saadaan muuttujaan, mutta miten sen saisi tuollain, että kun painaa ENTERiä. Tarkoitus olis vielä saada tallentumaan noi, jos on joku toinen ohjelma auki päälimmäisenä.
Kieli siis C++.
Taustalta näppäinten huomaamiseen voisi Windowsissa auttaa GetAsyncKeyState, ja silmukka on silloin aika kätevä väline.
#include <windows.h> #define KeyDown(VK_CODE) ((GetAsyncKeyState(VK_CODE) & 0x8000) ? true : false) while (!KeyDown(VK_RETURN)) Sleep(1); // Odotetaan enteriä; Sleep, jottei mene kaikki teho tyhjään silmukkaan // Tallenna sijainti... ja sitten sama uudestaan.
En käytä Windowsia, en voi testata. ;)
for(int x=0;x<=3;x++) { cout << "Paina ENTER kun kursori on kohdassa " << x+1 << "...\n"; while (!KeyDown(VK_RETURN)) { Sleep(1); } GetCursorPos(&pt); hiiri[x][0] = pt.x; hiiri[x][1] = pt.y; } for(int x=0;x<=3;x++) { cout << hiiri[x][0] << endl << hiiri[x][1] << endl << endl; }
Tuossa on pätkä koodista jonka tein testiksi nopeasti. Hyvin toimii muuten, mutta tarkoitus olisi painaa neljä kertaa enteriä, mutta ilmenee ongelmia:
Paina ENTER kun kursori on kohdassa 1... //tässä kohtaa painan enteriä Paina ENTER kun kursori on kohdassa 2... Paina ENTER kun kursori on kohdassa 3... Paina ENTER kun kursori on kohdassa 4... 479 578 479 578 479 578 479 578 //tähän loppuu ohjelman suoritus
Eli veikkaisin, että pidän sitä entteriä pohjassa liian kauan (n. 0.1 sec), ja tuo koko for-silmukka menee kerrasta läpi. Tuohon ei voi oikeen mitään sleep-rajoitusta laittaa, koska haluaisin ohjelman toimivan niin, että käyttäjä voi painaa sitä entteriä vaikka 0,5sec välein jos haluaa.
Voisiko jollain simuloida sen nappulan ylösnostamisen heti tuon tarvittavan tiedon keräämisen jälkeen?
Voit toki lisätä käänteisen odotuksen siihen perään:
// Kun nappi ei ole pohjassa, sleep // Tallennetaan sijainti // Niin kauan kuin nappi pysyy vielä pohjassa, sleep
Tuossa on tietenkin aina se riski, että nopeat yhden millisekunnin napautukset eivät tallennu. :)
KeyDown-makroni huomioi, kuten näkyy, paluuarvosta bitin 0x8000, joka kertoo näppäimen tilan sillä hetkellä. Sen sijaan bitti 1 kertoo, onko näppäintä painettu edellisen tarkistuksen jälkeen. Tässä on vain yksi vaara: bitti on yhteinen kaikille ohjelmille, eli jos jokin muu ohjelma sattuu tarkistamaan tilanteen ensin, tieto uudesta painalluksesta katoaa. Tätäkin tapaa voi tietysti käyttää tuossa tukena, ja kummassakin on riskinsä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.