NumLock, CapsLock, és ScrollLock kapcsolgatása C#-ból

RoliSoft
2007 augusztus 10, péntek 00:55

Igazából a cím csak a tartalom felétől lesz megfelelő, ugyanis jön egy kis bevezető.

Ahhoz hogy NumLock-ot meg egyéb gombokat kapcsolgathassunk, legjobb módszer ha azt meg is nyomjuk, csak épp szoftveresen. C#-ben ezt úgy lehet elérni, hogy Windows API hívásokkal dobálózunk és a user32.dll rendszerfájlnak használjuk a keybd_event függvényét.

Hogy ezt elérhessük, (user32 -> keybd_event) a következő kóddal kell bővíteni a kódot:

[DllImport("user32", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
private static extern void keybd_event(byte bVk, byte bScan, long dwFlags, long dwExtraInfo);

Most, hogy meg van ez is, a következő lépés a használt gombok definiálása lesz:

const int VK_NUMLOCK = 0x90;
const int VK_SCROLL = 0x91;
const int VK_CAPITAL = 0x14;
const int KEYEVENTF_KEYUP = 0x02;

A neveket, és a hozzátartozó értékeket innen lehet kinézni.
Most pedig már lehet szoftveresen leütni a billentyűket:

keybd_event(VK_NUMLOCK, 0x45, 0, 0);
keybd_event(VK_NUMLOCK, 0x45, KEYEVENTF_KEYUP, 0);

Ez a fenti kód lenyomja a NumLock billentyűt, majd elengedi, így elérve azt, ami akkor történik ha a billentyűzeten ütnénk meg a NumLock billentyűt.

Ez egy gyors bemutató volt, hogy hogy lehet Windows API hívásokat csinálni C#-ból. Akk részletesebben szeretné tanulmányozni a Windows API hívásait, az a pinvoke.net oldalra tessékeljen, ott meg szépen fel vannak boncolva fájlok, és a bennük meghívható függvények.

Easter Egg-ként (?!?) írtam egy kis haszontalan alkalmazást, ami a NumLock, CapsLock, és ScrollLock billentyűket nyomogatja (lásd. első kép). Innen tölthető le, és tartalmazza a forrást is.

Hozzászólások
Mondjuk Delphiben mindenféle előzetes konstansozás meg minden nélkül ennyi:

[code=delphi] GetKeyboardState(KeyState);
if (KeyState[VK_CAPITAL]=0) then begin
Keybd_Event(VK_CAPITAL, 1, KEYEVENTF_EXTENDEDKEY or 0, 0);
Keybd_Event(VK_CAPITAL, 1, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end else begin
Keybd_Event(VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY or 0, 0);
Keybd_Event(VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end;[/code]

És átlátható...



ui.: nem tudom, minek raktad be ide ezt a szaros webformsz2-t, amikor összesen 1 azaz egy böngésző támogatja, amit mindössze csak 1%-a az internetezőknek használ... :rolleyes: Ráadásul szerintem miatta nem lehet szép delphfin formázást rakni a kódomra... :-(

[i]Raktam formázást a kódodra! - [b]RoliSoft[/b][/i]