» »

Funkcija GetAsyncKeyState

Funkcija GetAsyncKeyState

GummyBear ::

Izdelati želim aplikacijo, ki bi mi omogočala, da na posamezne tipke nastavim določene bližnjice... kadarkoli in kjerkoli bi pritisnil zaporedje ali kombinacijo določenih tipk, bi se izvedel nek dogodek. Recimo kombinacija tipke CTRL in F1 bi sprožila nek dogodek. Če bi zaporedoma pritisnil tipke m,u,t,e bi aplikacija to razumela kot nek dogodek in utišala vse zvoke (mute) itd. Verjamem, da take zadeve že obstajajo, vendar mi je cilj izdelati lastno aplikacijo... v prvi vrsti za namene učenja, kasneje pa bi jo lahko prilagajal po svojih potrebah.

Funkcija GetAsyncKeyState preveri ali je bila tipka pritisnjena. Če jo vstavim v for zanko (od 0 do 256) preveri za vse tipke, v tem območju. Ta del že v redu dela, saj dobim informacije kdaj je bila pritisnjena katera tipka oz. kombinacija tipk. Težava pa je, ker iz neznanega razloga določene tipke preskoči. Če recimo vpišem "slotech" mi pobere samo nekaj črk in dobim besedo "sltch" ali pa morda "sloth"... kar pa se razlikuje od tistega, kar je bilo dejansko natipkano. Isto funkcijo sem napisal v C# in C++ in v obeh primerih se pojavi isti problem. Zanimivo pa je, da oba programa na drugem računalniku delata brez spuščanja znakov.

Zanima me, zakaj se določeni znaki izpustijo? Kolikor vem, bi lahko problem bil, če tipke posluša že neka druga aplikacija (ali druga instanca programa), vendar ne najdem nobene aplikacije ali procesa, ki bi bil lahko kriv. Če je to res, me zanima kako najdem aplikacijo, ki posluša tipke?

ragezor ::

daj svojo kodo

GummyBear ::

// na začetku classa:
[DllImport("user32.dll")]
public static extern int GetAsyncKeyState(Int32 i);
// v funkciji main:
for (Int32 i = 0; i < 256; i++)
{
int keyState = GetAsyncKeyState(i);
if (keyState == 1 || keyState == -32767) {
    Console.WriteLine("Tipka: " + (char)i);
    // od tukaj naprej preverjam kombinacije oz. zaporedja in kličem določene funkcije
   }
}


Že pri izpisu tipke pride do težave, saj mi določih tipk (gre za čisto naključje) ne prebere in jih moram večkrat pritisniti, da pride do učinka. Zakaj je temu tako?

Randomness ::

Pogoj spremeni v tole
if (keyState & 1) {...}
. Drugače tvoji pomisleki, ki si jih navedel, delno držijo. Verjetno bi bilo bolj primerno uporabiti kak drug Win32 način za to, kar želiš ti doseči.

Pa na MSDN imaš precej dobro dokumentacijo, ki se jo splača prebrati (in razumeti).
https://msdn.microsoft.com/en-us/librar...

Zgodovina sprememb…

ragezor ::

Moras iti nizje. Getasynckey state ti bere iz thread message queuea. Tole je namenjeno samo tistemu programu, ki ima keyboard focus kolikor razumem. A tvoj program vpliva kaj na to ko recimo pises v wordu text ali pa v browser oz kamorkoli?

Anyway, iti moras nize in implementirati hook, ki poslusa pred thread message queuejem

https://msdn.microsoft.com/en-us/librar...

Spura ::

Verjetno pollas na nek interval in ti kake tipke vmes sfalijo pol. Drugace se to dela s system-wide keyboard hooki.

Looooooka ::

GummyBear je izjavil:


// na začetku classa:
[DllImport("user32.dll")]
public static extern int GetAsyncKeyState(Int32 i);
// v funkciji main:
for (Int32 i = 0; i < 256; i++)
{
int keyState = GetAsyncKeyState(i);
if (keyState == 1 || keyState == -32767) {
Console.WriteLine("Tipka: " + (char)i);
// od tukaj naprej preverjam kombinacije oz. zaporedja in kličem določene funkcije
}
}


Že pri izpisu tipke pride do težave, saj mi določih tipk (gre za čisto naključje) ne prebere in jih moram večkrat pritisniti, da pride do učinka. Zakaj je temu tako?

Verjetno se bo bolj pametno hookat na WH_KEYBOARD...razlog, da ti ne pikaže črk je v tem, da se očitno loopaš in upaš, da boš pravočasno ujel klik...narobe, ker ne moreš garantirati, da se bo preverjenje izvedlo v pravem trenutku.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Keylogger

Oddelek: Programska oprema
352624 (1351) Blisk
»

[C++] Sledenje tipkovnici

Oddelek: Programiranje
71400 (1195) TEDY
»

[C#]Textbox ki dovoli samo številke

Oddelek: Programiranje
121350 (1214) darkolord
»

[C#] unmanaged->managed code

Oddelek: Programiranje
112138 (2013) Zzzzzzz
»

DirectX, neki ne gre

Oddelek: Programiranje
61148 (1046) Senitel

Več podobnih tem