summaryrefslogtreecommitdiff
path: root/windows/neo-vars/src/source/keyboardleds.ahk
diff options
context:
space:
mode:
authormartin_r <martin_r@b9310e46-f624-0410-8ea1-cfbb3a30dc96>2008-11-13 17:14:59 +0000
committermartin_r <martin_r@b9310e46-f624-0410-8ea1-cfbb3a30dc96>2008-11-13 17:14:59 +0000
commit22000d59b5c0fb737a0f683f2be5e71bc11f71a1 (patch)
treefccccabaf7df065bfed45a035d555fb252fd0919 /windows/neo-vars/src/source/keyboardleds.ahk
parentfe102c86d57416be8877bacce060748430874f97 (diff)
downloadneo-layout-22000d59b5c0fb737a0f683f2be5e71bc11f71a1.tar.gz
neo-layout-22000d59b5c0fb737a0f683f2be5e71bc11f71a1.tar.bz2
neo-layout-22000d59b5c0fb737a0f683f2be5e71bc11f71a1.zip
git-svn-id: https://svn.neo-layout.org@1187 b9310e46-f624-0410-8ea1-cfbb3a30dc96
Diffstat (limited to 'windows/neo-vars/src/source/keyboardleds.ahk')
-rw-r--r--windows/neo-vars/src/source/keyboardleds.ahk87
1 files changed, 87 insertions, 0 deletions
diff --git a/windows/neo-vars/src/source/keyboardleds.ahk b/windows/neo-vars/src/source/keyboardleds.ahk
new file mode 100644
index 0000000..662d4c2
--- /dev/null
+++ b/windows/neo-vars/src/source/keyboardleds.ahk
@@ -0,0 +1,87 @@
+;ScrollLock=1, NumLock=2, CapsLock=4, bzw. eine beliebige Summe dieser Werte
+KeyboardLED(LEDvalue, Cmd){ ; LEDvalue: ScrollLock=1, NumLock=2, CapsLock=4 ; Cmd = on/off/switch
+ Static h_device
+ If ! h_device ; initialise
+ {
+ device=\Device\KeyBoardClass0
+ SetUnicodeStrLED(fn,device)
+ h_device:=NtCreateFileLED(fn,0+0x00000100+0x00000080+0x00100000,1,1,0x00000040+0x00000020,0)
+ }
+ VarSetCapacity(output_actual,4,0)
+ input_size=4
+ VarSetCapacity(input,input_size,0)
+ If Cmd=switch ;switches every LED according to LEDvalue
+ KeyLED:=LEDvalue
+ If Cmd=on ;forces all choosen LED's to ON (LEDvalue= 0 ->LED's according to keystate)
+ KeyLED:=LEDvalue | (GetKeyState("ScrollLock", "T") + 2*GetKeyState("NumLock", "T") + 4*GetKeyState("CapsLock", "T"))
+ If Cmd=off ;forces all choosen LED's to OFF (LEDvalue= 0 ->LED's according to keystate)
+ {
+ LEDvalue:=LEDvalue ^ 7
+ KeyLED:=LEDvalue & (GetKeyState("ScrollLock","T") + 2*GetKeyState("NumLock","T") + 4*GetKeyState("CapsLock","T"))
+ }
+ ; EncodeIntegerLED(KeyLED,1,&input,2) ;input bit pattern (KeyLED): bit 0 = scrolllock ;bit 1 = numlock ;bit 2 = capslock
+ input:=Chr(1) Chr(1) Chr(KeyLED)
+ input:=Chr(1)
+ input=
+ success:=DllCall("DeviceIoControl"
+ , "uint", h_device
+ , "uint", CTL_CODE_LED( 0x0000000b ; FILE_DEVICE_KEYBOARD
+ , 2
+ , 0 ; METHOD_BUFFERED
+ , 0 ) ; FILE_ANY_ACCESS
+ , "uint", &input
+ , "uint", input_size
+ , "uint", 0
+ , "uint", 0
+ , "uint", &output_actual
+ , "uint", 0 )
+}
+
+CTL_CODE_LED(p_device_type,p_function,p_method,p_access ){
+ Return, ( p_device_type << 16 ) | ( p_access << 14 ) | ( p_function << 2 ) | p_method
+}
+
+NtCreateFileLED(ByRef wfilename,desiredaccess,sharemode,createdist,flags,fattribs){
+ VarSetCapacity(fh,4,0)
+ VarSetCapacity(objattrib,24,0)
+ VarSetCapacity(io,8,0)
+ VarSetCapacity(pus,8)
+ uslen:=DllCall("lstrlenW","str",wfilename)*2
+ InsertIntegerLED(uslen,pus,0,2)
+ InsertIntegerLED(uslen,pus,2,2)
+ InsertIntegerLED(&wfilename,pus,4)
+ InsertIntegerLED(24,objattrib,0)
+ InsertIntegerLED(&pus,objattrib,8)
+ status:=DllCall("ntdll\ZwCreateFile","str",fh,"UInt",desiredaccess,"str",objattrib,"str",io,"UInt",0,"UInt",fattribs
+ ,"UInt",sharemode,"UInt",createdist,"UInt",flags,"UInt",0,"UInt",0, "UInt")
+ return ExtractIntegerLED(fh)
+}
+
+SetUnicodeStrLED(ByRef out, str_){
+ VarSetCapacity(st1, 8, 0)
+ InsertIntegerLED(0x530025, st1)
+ VarSetCapacity(out, (StrLen(str_)+1)*2, 0)
+ DllCall("wsprintfW", "str", out, "str", st1, "str", str_, "Cdecl UInt")
+}
+
+ExtractIntegerLED(ByRef pSource, pOffset = 0, pIsSigned = false, pSize = 4){
+; pSource is a string (buffer) whose memory area contains a raw/binary integer at pOffset.
+; The caller should pass true for pSigned to interpret the result as signed vs. unsigned.
+; pSize is the size of PSource's integer in bytes (e.g. 4 bytes for a DWORD or Int).
+; pSource must be ByRef to avoid corruption during the formal-to-actual copying process
+; (since pSource might contain valid data beyond its first binary zero).
+ Loop %pSize% ; Build the integer by adding up its bytes.
+ result += *(&pSource + pOffset + A_Index-1) << 8*(A_Index-1)
+ if (!pIsSigned OR pSize > 4 OR result < 0x80000000)
+ return result ; Signed vs. unsigned doesn't matter in these cases.
+ ; Otherwise, convert the value (now known to be 32-bit) to its signed counterpart:
+ return -(0xFFFFFFFF - result + 1)
+}
+
+InsertIntegerLED(pInteger, ByRef pDest, pOffset = 0, pSize = 4){
+; The caller must ensure that pDest has sufficient capacity. To preserve any existing contents in pDest,
+; only pSize number of bytes starting at pOffset are altered in it.
+ Loop %pSize% ; Copy each byte in the integer into the structure as raw binary data.
+ DllCall("RtlFillMemory", "UInt", &pDest + pOffset + A_Index-1, "UInt", 1, "UChar", pInteger >> 8*(A_Index-1) & 0xFF)
+}
+