Moikka kaikille!
Kirjoittelen aikani kuluksi bottia, joka ratkoo Windowsin miinaharavaa. Logiikkapuoli on jo täysin valmis, mutta vielä uupuu miinaharavan kanssa työskentelyn mahdollistavat kikat. Ajattelin, että botti ottaisin kuvankaappauksen ruudusta ja lukisi sitä kautta miinaharavaa graafisesti. Sitten se liikuttaisi hiirtä kuin ihminen ja painaisi haluamaansa kohtaa pelialueelta.
En kuitenkaan ole googlettamalla päässyt selvyyteen, miten hiiren pitäisi toimia. Kuvankaappaus näyttää helpolta hommalta, mutta jos joku osaisi neuvoa minua hieman siinäkin, olisin tyytyväinen ja saisin haluamani tuloksen hieman nopeammin.
Käytössäni on C++ ja ilmeisesti WinAPIn puoleen pitäisi kääntyä?
Otat selville ruudun leveyden, korkeuden, mistä miinat alkaa yms.
Sovitat jokaiseen miinaruutuun numeromiinaruudun kuvaa -> Taulukko miinaruutujen arvoista.
Klikkailussa tarvitset vain klikkauksen koordinaatit(hyödynnä 1. kohtaa). Erilaisia autoclick kirjastoja on useita. WinAPIssakin saattaa olla.
Nykyään suositeltava tapa hiiren liikuttamiseen on SendInput-funktio, joka on dokumentoitu MSDN:ssä varsin kattavasti. (Aiemmin oli käytössä mouse_event, josta myöskin löytyy haulla tietoa.)
Kuvakaappauksiin tuntui löytyvän Googlella jopa valmista koodia. Itse tunnistaisin numerot kuvasta yksinkertaisesti värin perusteella.
Aikoinaan pysty WinAPI kanssa lukemaan HDC 0:sta koko ruudun (desktop) oli siinä miten monta ikkunaa tahansa, jopa nettiselaimen flash pelit kun sekin piirtyy vaan raakana pikselidatana. En tiedä onnistuuko enää Win7 aikana näin. Laitteistokiihdytys voi sotkea.
Tutustuin tähän kirjoitelmaan ja tein esimerkkikoodin copypastella. Yritin kääntää koodin, mutta sain virheviestejä.
winapi.c: In function 'MouseMove': winapi.c:9:5: error: 'INPUT' undeclared (first use in this function) winapi.c:9:5: note: each undeclared identifier is reported only once for each function it appears in winapi.c:9:11: error: expected ';' before 'in' winapi.c:10:5: error: 'in' undeclared (first use in this function) winapi.c:10:15: error: 'INPUT_MOUSE' undeclared (first use in this function)
Virheistä selviää, ettei INPUT- ja INPUT_MOUSE-määritteitä löydy, vaikka windows.h on otettu mukaan koodiin ja koodi käännettiin käyttäen -mwindows-lippua. Mistä mahtaa johtua?
Ehkä kääntäjä kohdentaa käännöksen liian vanhalle Windowsin versiolle. Kokeile laittaa koodin alkuun seuraava define:
#define WINVER 0x0501 /* WinXP */
Jos tämä ei auta, tarkista, että kyseiset rakenteet edes löytyvät kääntäjäsi WinAPI-otsikoista.
Koodailen tätä töissä koneella, jossa on Windows 7 ja ihmeellisesti Mingw32 asennettuna. Kääntäjä g++ ja kirjastoina ilmeisesti Mingw:n omat headerit. Tutkailin antamaasi WINVER-määritystä ja löysin tiedostosta w32api.h arvot Windowseille väliltä 95 -> Vista, mutta seiskalle ei ole vastaavaa koodia. Kokeilin Vistan arvoa 0x0600
, mutta kääntäjä antaa samaa virhettä.
Headereita tutkimalla selvisi, että INPUT löytyy ainakin winuser.h:sta, mutta muita windows-henkisiä tiedostoja en lähtenyt tutkimaan. Pitäisi varmaan ladata Visual C++ tai vastaava Windowsille hyvin kelpaava kääntäjäpaketti.
Itse olen kyllä kääntänyt SendInputia käyttävän ohjelman menestyksekkäästi MinGW:llä ilman lisäsäätöjä. Voisit ensiksi asentaa uusimman MinGW:n (4.5-sarjaa) kaikkine otsikkotiedostoineen. Jos tämä ei riitä, tutki headerista, millaisten esikääntäjän ehtojen (#if, #ifdef jne.) sisällä tarvittava määrittely on, niin voit asettaa oikeat ehdot #define-riveillä. Kyllä sen jollain sieltä saa.
Jopas! Huomasin, että Mingw:llä kääntäessä täytyy ottaa windows.h:n lisäksi winable.h mukaan, jotta input-komentoja pystyy lähetellä. Vika ei ollutkaan kirjastoissa vaan minussa. Hyvä että selvisi. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.