AutoHotkey Community

It is currently May 27th, 2012, 7:25 am

All times are UTC [ DST ]




Post new topic Reply to topic  [ 21 posts ]  Go to page 1, 2  Next
Author Message
PostPosted: June 16th, 2006, 7:08 pm 
Offline

Joined: August 24th, 2005, 5:17 pm
Posts: 1237
This script allows you to control which capslock/numlock/scrolllock LED indicators are lit up, to produce effects such as flashing and cycling without altering the actual state of those keys (i.e. doesn't interfere with typing).

The script consists of 2 sections: 1) Some examples near the top. 2) The necessary functions.

The code originated here: Using Keyboard LEDs for spectrum.

Credit goes to Shimanov for the original code, Peter for syntax improvements and JGR for the code to get the handle of the keyboard device directly.

Code:
; Keyboard LED control (capslock/numlock/scrolllock lights)
;   http://www.autohotkey.com/forum/viewtopic.php?t=10532

; USAGE: KeyboardLED(LEDvalue,"Cmd")  ; LEDvalue: ScrollLock=1, NumLock=2, CapsLock=4 ; Cmd = on/off/switch


Loop, 3 ; flash all LEDs
  {
  KeyboardLED(7,"on")
  Sleep, 500
  KeyboardLED(7,"off")
  Sleep, 500
  }
 
Loop, 3 ; flash ScrollLock LED
  {
  KeyboardLED(7,"off")
  KeyboardLED(4,"switch")
  Sleep, 500
  KeyboardLED(7,"off")
  Sleep, 500
  }

Loop, 3 ; cycle all LEDs left to right
  {
  KeyboardLED(7,"off")
  Sleep, 250
  KeyboardLED(2,"switch")
  Sleep, 250
  KeyboardLED(4,"switch")
  Sleep, 250
  KeyboardLED(1,"switch")
  Sleep, 250
  }

Loop, 3 ; progress bar in LEDs
  {
  KeyboardLED(7,"off")
  Sleep, 500
  KeyboardLED(2,"switch")
  Sleep, 500
  KeyboardLED(6,"switch")
  Sleep, 500
  KeyboardLED(7,"switch")
  Sleep, 500
  }

Loop, 3 ; Knight Rider KITT cycling all LEDs ;-)
  {
  KeyboardLED(2,"switch")
  Sleep, 500
  KeyboardLED(4,"switch")
  Sleep, 500
  KeyboardLED(1,"switch")
  Sleep, 500
  KeyboardLED(4,"switch")
  Sleep, 500
  }

KeyboardLED(0,"off")  ; all LED('s) according to keystate (Command = on or off)
Return



KeyboardLED(LEDvalue, Cmd)  ; LEDvalue: ScrollLock=1, NumLock=2, CapsLock=4 ; Cmd = on/off/switch
{
  Static h_device
  If ! h_device ; initialise
    {
    device =\Device\KeyBoardClass0
    SetUnicodeStr(fn,device)
    h_device:=NtCreateFile(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"))
    }
  ; EncodeInteger( 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( 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( p_device_type, p_function, p_method, p_access )
{
  Return, ( p_device_type << 16 ) | ( p_access << 14 ) | ( p_function << 2 ) | p_method
}


NtCreateFile(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
  InsertInteger(uslen,pus,0,2)
  InsertInteger(uslen,pus,2,2)
  InsertInteger(&wfilename,pus,4)
  InsertInteger(24,objattrib,0)
  InsertInteger(&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 % ExtractInteger(fh)
}


SetUnicodeStr(ByRef out, str_)
{
  VarSetCapacity(st1, 8, 0)
  InsertInteger(0x530025, st1)
  VarSetCapacity(out, (StrLen(str_)+1)*2, 0)
  DllCall("wsprintfW", "str", out, "str", st1, "str", str_, "Cdecl UInt")
}


ExtractInteger(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)
}


InsertInteger(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)
}


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: June 16th, 2006, 11:45 pm 
Offline

Joined: August 24th, 2005, 5:17 pm
Posts: 1237
Here's a simple script I wrote to "disable" the NumLock LED on my laptop (it's quite distracting since I'm usually using an external keyboard and never change the status really). The script just checks the numlock state and if numlock is on it turns the LED off and vice versa (i.e. it becomes a Numlock-Off LED):

Code:
Gosub, ~NumLock
Return

~NumLock::
~CapsLock::
~ScrollLock::
  Sleep, 10 ; improve reliability of setting LED state sometimes
  If (GetKeyState("Numlock", "T"))
    KeyboardLED(2,"off")
  Else
    KeyboardLED(2,"on")
Return


(Obviously this requires the functions from the main script in the 1st post)


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: June 17th, 2006, 12:38 am 
Wow this rocks, you're cool.
I don't have my other computer with the USB keyboard, so I'll have to try with it another time.
Thanks!


Report this post
Top
  
Reply with quote  
 Post subject:
PostPosted: June 17th, 2006, 1:17 am 
Aww it doesn't, but it works with your older version, must be some kind of detection. Like replacing the ACPI for HID :confused:


Report this post
Top
  
Reply with quote  
 Post subject:
PostPosted: June 17th, 2006, 1:57 am 
Offline

Joined: August 24th, 2005, 5:17 pm
Posts: 1237
Does it work on the USB keyboard if you change the 0 in "device =\Device\KeyBoardClass0" to 1 or 2?

I have a USB keyboard, but it doesn't have LEDs so I can't test.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: June 17th, 2006, 3:12 am 
I'm pretty sure it can, but right now I can't. I'll tell you another time, maybe someone can try it out. My saitek gaming keyboard is usb only, can't use the adaptor.
There's also something funny when using the script, when the loop go too fast, like 100ms for each action it sometimes double a key when typing.

Also, remember to check out:
http://www.samurize.com/modules/mydownl ... 6&lid=1886
Samurize.com - Downloads

It uses the leds as spectrum, but only works with ps2 keyboards.


Report this post
Top
  
Reply with quote  
 Post subject:
PostPosted: June 17th, 2006, 8:33 am 
Offline

Joined: March 28th, 2004, 3:53 pm
Posts: 1870
just tried it out... looks good! can be used for some mail notifications etc.

_________________
Image


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: June 26th, 2006, 2:47 am 
Offline

Joined: June 22nd, 2006, 8:36 pm
Posts: 27
Any ideas of how to use it for mail notifications?


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: June 26th, 2006, 11:15 am 
Offline

Joined: August 24th, 2005, 5:17 pm
Posts: 1237
There doesn't seem to be a particularly direct way with AHK (try searching the forums) so I guess the best way would be to retrieve info from a mail monitoring program with SetTimer (you could hide the window so it's not visible).


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: June 26th, 2006, 5:30 pm 
Omfg, i'm really mad, I dont know how to put this code into order so i can run it correctly... I WANT TO USE

Loop, 3 ; Knight Rider KITT cycling all LEDs ;-)

But how do i put it into the other code? can someone do this for me?¿?¿!!!

PLEASE.


Report this post
Top
  
Reply with quote  
 Post subject:
PostPosted: June 26th, 2006, 9:40 pm 
Offline

Joined: August 24th, 2005, 5:17 pm
Posts: 1237
You just need to put the following part where you want the changes to occur in your script:
Code:
Loop, 3 ; Knight Rider KITT cycling all LEDs ;-)
  {
  KeyboardLED(2,"switch")
  Sleep, 500
  KeyboardLED(4,"switch")
  Sleep, 500
  KeyboardLED(1,"switch")
  Sleep, 500
  KeyboardLED(4,"switch")
  Sleep, 500
  }

KeyboardLED(0,"off")  ; all LED('s) according to keystate (Command = on or off)


And all of the functions need to go at the end of your script (i.e. everything after the Return in the 1st post).


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: June 28th, 2006, 12:03 am 
Offline

Joined: January 20th, 2006, 4:48 am
Posts: 29
Location: Colorado, USA
cool.

way cool.

an interesting thing to do is to make a kind of "light tester"

with the following code the lights blink approximately at 60hz, thus if the keyboard is near a fast switching light like flourescent one or a strobe light, the light that is flashing out of sync is obvious.

{
method for additional security(?) :
ask user password- final digit is one two or three according to the "secret"
oddball LED (found by using a strobelight)?

of course this would be for simple security like for stopping kids from downloading games off of the internet (very very minimal security).
}

Code:

loop, 30
{
random,key,0,2
if key=0
{
key1=6
key2=1
}
if key=1
{
key1=5
key2=2
}
if key=2
{
key1=3
key2=4
}
loop, 60
{

KeyboardLED(key2,"off")
KeyboardLED(key1,"on")
sleep,9
KeyboardLED(key1,"off")
KeyboardLED(key2,"on")
sleep,8
}
sleep,1000
}
KeyboardLED(0,"off")
return


of course, with the above function


Report this post
Top
 Profile  
Reply with quote  
PostPosted: November 9th, 2006, 11:05 am 
Sorry to dredge up this old thread, but I just got started with AutoHotkey and had the urge to make an LED show. I made it first without this script, and when I ported it, it became glitchy, especially with the NumLock. I will present both forms of the code and any help on the 2nd would be appreciated.
Code:
/*
---------------leD sHOW by veZquEx-----------------
| eNjOy a CONtiNUOs LoOP OF InDICaTiNG excIteMEnt.|
| WarNINg: mAy scReW wITh caPitAlIzaTION.         |
|               pResS "EsC" TO PAUse              |
---------------------------------------------------
*/


SetNumlockState, off
SetCapsLockState, off
SetScrollLockState, off

Continuous:
Loop {
   Loop 6 {
;walk
      SetNumlockState, on
      Sleep, 100
      SetNumlockState, off
      SetCapsLockState, on
      Sleep, 100
      SetCapsLockState, off
      SetScrollLockState, on
      Sleep, 100
      SetScrollLockState, off
      SetCapsLockState, on
      Sleep, 100
      SetCapsLockState, off
   }
   Loop 4 {
;add
      SetNumlockState, on
      Sleep, 100
      SetCapsLockState, on
      Sleep, 100
      SetScrollLockState, on
      Sleep, 100
      SetScrollLockState, off
      Sleep, 100
      SetCapsLockState, off
      Sleep, 100
      SetNumlockState, off
      Sleep, 300
   }
   Loop 8 {
;flash all
      SetNumlockState, on
      SetCapsLockState, on
      SetScrollLockState, on
      Sleep, 100
      SetScrollLockState, off
      SetCapsLockState, off
      SetNumlockState, off
      Sleep, 100
   }
   SetNumlockState, on
   SetCapsLockState, on
   SetScrollLockState, on
   Sleep, 100
   Loop 3 {
      SetNumlockState, off
      SetCapsLockState, off
      Sleep, 200
      SetNumlockState, on
      SetCapsLockState, on
      SetScrollLockState, off
      Sleep, 200
      SetScrollLockState, on
   }
   Loop 3 {
      SetCapsLockState, off
      SetScrollLockState, off
      Sleep, 200
      SetCapsLockState, on
      SetScrollLockState, on
      SetNumlockState, off
      Sleep, 200
      SetNumlockState, on
   }
   Loop 3 {
      SetNumlockState, off
      SetScrollLockState, off
      Sleep, 200
      SetCapsLockState, off
      SetNumlockState, on
      SetScrollLockState, on
      Sleep, 200
      SetCapsLockState, on
   }
   Sleep, 300
   SetNumlockState, off
   Sleep, 300
   SetCapsLockState, off
   Sleep, 300
   SetScrollLockState, off
   Sleep, 750
}

Escape::
SetNumlockState, on
SetCapsLockState, off
SetScrollLockState, off
Pause
Return

Code:
/*
--------------leD sHOW 2 by veZquEx----------------
| eNjOy a CONtiNUOs LoOP OF InDICaTiNG excIteMEnt.|
|               pResS "EsC" TO PAUse              |
---------------------------------------------------
*/



Continuous:
Loop {
   Loop 6 {
;walk
      KeyboardLED(2,"on")
      Sleep, 100
      KeyboardLED(2,"off")
      KeyboardLED(4,"on")
      Sleep, 100
      KeyboardLED(4,"off")
      KeyboardLED(1,"on")
      Sleep, 100
      KeyboardLED(1,"off")
      KeyboardLED(4,"on")
      Sleep, 100
      KeyboardLED(4,"off")
   }
   Loop 4 {
;add
      KeyboardLED(2,"on")
      Sleep, 100
      KeyboardLED(4,"on")
      Sleep, 100
      KeyboardLED(1,"on")
      Sleep, 100
      KeyboardLED(1,"off")
      Sleep, 100
      KeyboardLED(4,"off")
      Sleep, 100
      KeyboardLED(2,"off")
      Sleep, 300
   }
   Loop 8 {
;flash all
     KeyboardLED(7,"on")
      Sleep, 100
     KeyboardLED(7,"off")
      Sleep, 100
   }
  KeyboardLED(7,"on")
   Sleep, 100
   Loop 3 {
      KeyboardLED(2,"off")
      KeyboardLED(4,"off")
      Sleep, 200
      KeyboardLED(2,"on")
      KeyboardLED(4,"on")
      KeyboardLED(1,"off")
      Sleep, 200
      KeyboardLED(1,"on")
   }
   Loop 3 {
      KeyboardLED(4,"off")
      KeyboardLED(1,"off")
      Sleep, 200
      KeyboardLED(4,"on")
      KeyboardLED(1,"on")
      KeyboardLED(2,"off")
      Sleep, 200
      KeyboardLED(2,"on")
   }
   Loop 3 {
      KeyboardLED(2,"off")
      KeyboardLED(1,"off")
      Sleep, 200
      KeyboardLED(4,"off")
      KeyboardLED(2,"on")
      KeyboardLED(1,"on")
      Sleep, 200
      KeyboardLED(4,"on")
   }
   Sleep, 300
   KeyboardLED(2,"off")
   Sleep, 300
   KeyboardLED(4,"off")
   Sleep, 300
   KeyboardLED(1,"off")
   Sleep, 750
}

Escape::
KeyboardLED(2,"on")
KeyboardLED(4,"off")
KeyboardLED(1,"off")
Pause
Return

; Keyboard LED control (capslock/numlock/scrolllock lights)
;   http://www.autohotkey.com/forum/viewtopic.php?t=10532

; USAGE: KeyboardLED(LEDvalue,"Cmd")  ; LEDvalue: ScrollLock=1, NumLock=2, CapsLock=4 ; Cmd = on/off/switch


KeyboardLED(LEDvalue, Cmd)  ; LEDvalue: ScrollLock=1, NumLock=2, CapsLock=4 ; Cmd = on/off/switch
{
  Static h_device
  If ! h_device ; initialise
    {
    device =\Device\KeyBoardClass0
    SetUnicodeStr(fn,device)
    h_device:=NtCreateFile(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"))
    }
  ; EncodeInteger( 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( 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( p_device_type, p_function, p_method, p_access )
{
  Return, ( p_device_type << 16 ) | ( p_access << 14 ) | ( p_function << 2 ) | p_method
}


NtCreateFile(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
  InsertInteger(uslen,pus,0,2)
  InsertInteger(uslen,pus,2,2)
  InsertInteger(&wfilename,pus,4)
  InsertInteger(24,objattrib,0)
  InsertInteger(&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 % ExtractInteger(fh)
}


SetUnicodeStr(ByRef out, str_)
{
  VarSetCapacity(st1, 8, 0)
  InsertInteger(0x530025, st1)
  VarSetCapacity(out, (StrLen(str_)+1)*2, 0)
  DllCall("wsprintfW", "str", out, "str", st1, "str", str_, "Cdecl UInt")
}


ExtractInteger(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)
}


InsertInteger(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)
}


Report this post
Top
  
Reply with quote  
 Post subject:
PostPosted: November 13th, 2006, 4:58 am 
Offline
User avatar

Joined: August 30th, 2005, 8:43 pm
Posts: 8667
Location: Salem, MA
Using the original script in the first post, it ran on my laptops's LEDs, and changing the device to Device 2, as evl said to do earlier, makes it work with my USB keyboard.

Oddly, one of the lights on my laptop didn't flash, since it doesn't appear to be one of the normal 3 lights. It's even hard to descibe what it does normally. I need to have numlock and this light on at the same time to even use the 'numpad' section of my laptop (normal keys in another use)

Thanks!

_________________
Image
(Common Answers) - New Tutorials Forum - Humongous FAQ


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: September 26th, 2008, 5:47 pm 
Offline

Joined: September 23rd, 2008, 7:25 pm
Posts: 2
I don't suppose anyone has extended the code for the ThinkPad T60p with like 9 LED light across? I looked at the code and it's way over my head but just thought I'd ask.


Report this post
Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 21 posts ]  Go to page 1, 2  Next

All times are UTC [ DST ]


Who is online

Users browsing this forum: Yahoo [Bot] and 18 guests


You can post new topics in this forum
You can reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Powered by phpBB® Forum Software © phpBB Group