Minulla on vb-ohjelma joka tarkkailee näppäimistön painalluksia (ei ole näkyvää formia ollenkaan), mutta siinä on semmoinen ongelma että ohjelma ei käynnistämisen jälkeen huomaa näppäinten painalluksia sen jälkeen kun on käyttänyt/käyttää jotain toista ohjelmaa/klikannut jostain muuaalta. Miten olisi mahdollista tehdä niin, että ohjelma tarkkailisi näppäimiä kokoajan?
Luetko näppäinpainalluksia kuitenkin formin KeyDown- ja KeyUp-aliohjelmilla? Nämä toimivat vain silloin kun ohjelmasi ikkuna on aktiivinen.
Ratkaisu ongelmaan on käyttää WinApin GetAsyncKeyState-funktiota. Se palauttaa valitun näppäimen (tai myös hiiren painikkeiden) tilan. Esimerkkiohjelma ilmoittaa, kun käyttäjä painaa Shiftiä - tapahtui se missä tahansa ohjelmassa.
Declare Function GetAsyncKeyState Lib "User" (ByVal Key As Integer) As Integer Private Const VK_SHIFT = &H10 Private Sub Timer1_Timer If GetAsyncKeyState(VK_SHIFT) Then MsgBox "Painoit Shiftiä!" End If End Sub
Ja täältä löytyy luettelo kaikkien näppäimien koodeista (huomaa, että koodit on ilmoitettu heksadesimaalijärjestelmässä): http://msdn.microsoft.com/library/default.asp?
"Runtime error '53':
File not found: User
Ensimmäinen rivi on moduulissa (eikä auta että toinenkin rivi on). Käytän VB6
Ja kuuluuko kahden ensimmäisen rivin olla moduulissa?
Timer1 on olemassa...
Kokeilepa korvata User -> User32. Ylimmät rivit voivat olla joko moduulissa (Public rivien alussa) tai formissa (Private rivien alussa). Toimisiko siis näin?
Private Declare Function GetAsyncKeyState Lib "User32" (ByVal Key As Integer) As Integer Private Const VK_SHIFT = &H10 Private Sub Timer1_Timer If GetAsyncKeyState(VK_SHIFT) Then MsgBox "Painoit Shiftiä!" End If End Sub
Kiitos! Nyt toimii...
Jäi vain epäselväksi, miten luen kirjaimia...
Eli miten teen tuon niin että jos painaa aata niin tulee msg-boxi...
Eri näppäinten koodit löytyvät ensimmäisen viestini linkistä. Esimerkiksi A-näppäimen koodi on &H41. Voit myös määritellä kirjaimille vakiot ylläolevan koodin tapaan.
Itseasiassa näppäimiä ei tarkisteta aivan noin, vaan kannattaa käyttää and-maskia. Kuten MSDN paljastaa:
lainaus:
If the most significant bit is set, the key is down
Koska GetAsyncKeyState palauttaa 16-bittisen arvon, msb on bitti numero 15. Parempi tapa tarkistaa:
If GetAsyncKeyState(VK_SHIFT) And &H8000 Then MsgBox "Painoit Shiftiä!" End If
Aihe on jo aika vanha, joten et voi enää vastata siihen.