New
#11
Ok so I've looked into this a bit more and I'm currently porting the BASH script to AHK, stay tuned for a quick and dirty test version
Edit:
If you want to have a sneak-peek, this is the script I started out with:
http://www.shellperson.net/quickly-c...ail-with-bash/
It has evolved quite a bit since I found it but I want to make sure I don't forget to give him proper credit for the whole "detect new mail"-part :)
Edit2:
I'm stuck at trying to make the script detect new mail properly (currently hangs if I have new mail) and the keyboard LEDs doesn't seem to be working properly for me as they all stay blank. It's also getting a bit too late here (approx. 3:50 AM local time) so I'll post what I have so far and keep going tomorrow (I must say for someone who's used to C and BASH the syntax of AHK feels kind of awkward to work with).
Code:KeyboardLED(4,"on") InputBox, Username, Username, Enter username for mail.google.com InputBox, Password, Password, Enter password for mail.google.com, hide KeyboardLED(4,"off") loop { ; Thanks to aMailuhr for this line at http://www.autohotkey.com/forum/topic4486.html urldownloadtofile, https://%Username%:%Password%@mail.google.com/mail/feed/atom, temp.txt i := 0 loop, read, temp.txt { if (++i == 5) { if (A_LoopReadLine != "<fullcount>0</fullcount>") { Capslock::Run mail.google.com MsgBox, New mail KeyboardLED(4,"on") } else { ;Capslock::Run www.google.com ;Throws an error at me for remaping the key twice, fatal limitation? MsgBox, %A_LoopReadLine% KeyboardLED(4,"off") } sleep 5000 } } } ; Thanks to evl, Shimanov, Peter and JGR for the KeyboardLED function at http://www.autohotkey.com/forum/topic10532.html 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) }
Last edited by Djhg2000; 14 Mar 2011 at 21:53.