Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Vb-ohjelman näppäimistön kuuntelu

Heikki [10.08.2003 19:52:48]

#

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?

Antti Laaksonen [10.08.2003 21:02:56]

#

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?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp

Heikki [11.08.2003 17:35:36]

#

"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...

Antti Laaksonen [11.08.2003 20:09:45]

#

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

Heikki [11.08.2003 20:41:29]

#

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...

Antti Laaksonen [11.08.2003 22:07:31]

#

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.

thefox [12.08.2003 16:08:54]

#

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

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta