| 1 | /****************** |
|---|
| 2 | * Initialisierung * |
|---|
| 3 | ******************* |
|---|
| 4 | */ |
|---|
| 5 | |
|---|
| 6 | #MaxThreadsPerHotKey 1 |
|---|
| 7 | Thread,Interrupt,-1,-1 |
|---|
| 8 | |
|---|
| 9 | SetBatchLines -1 |
|---|
| 10 | SetCapsLockState Off |
|---|
| 11 | SetNumLockState Off |
|---|
| 12 | SetScrollLockState Off |
|---|
| 13 | |
|---|
| 14 | name=Neo 2.0 (%A_ScriptName%) (r%Revision%-r%CompRevision%) |
|---|
| 15 | enable=Aktiviere %name% |
|---|
| 16 | disable=Deaktiviere %name% |
|---|
| 17 | #usehook on |
|---|
| 18 | #singleinstance force |
|---|
| 19 | #LTrim ; Quelltext kann einger�ckt werden, |
|---|
| 20 | Process,Priority,,High |
|---|
| 21 | Sendmode Input |
|---|
| 22 | #MaxHotkeysPerInterval 2000 |
|---|
| 23 | |
|---|
| 24 | /**************** |
|---|
| 25 | * Verzeichnisse * |
|---|
| 26 | ***************** |
|---|
| 27 | */ |
|---|
| 28 | ; Setzt den Pfad zu einem tempor�ren Verzeichnis |
|---|
| 29 | EnvGet, WindowsEnvTempFolder, TEMP |
|---|
| 30 | ResourceFolder = %WindowsEnvTempFolder%\NEO2 |
|---|
| 31 | FileCreateDir, %ResourceFolder% |
|---|
| 32 | |
|---|
| 33 | ; Setzt den Pfad zu den NEO-Anwendungsdateien |
|---|
| 34 | EnvGet, WindowsEnvAppDataFolder, APPDATA |
|---|
| 35 | ApplicationFolder = %WindowsEnvAppDataFolder%\NEO2 |
|---|
| 36 | FileCreateDir, %ApplicationFolder% |
|---|
| 37 | ini = %ApplicationFolder%\NEO2.ini |
|---|
| 38 | |
|---|
| 39 | /******************* |
|---|
| 40 | * Globale Schalter * |
|---|
| 41 | ******************** |
|---|
| 42 | */ |
|---|
| 43 | ; Im folgenden gilt (soweit nicht anders angegeben) Ja = 1, Nein = 0: |
|---|
| 44 | |
|---|
| 45 | ; Sollen die Bilder f�r die Bildschirmtastatur in die compilierte EXE-Datei miteingebunden werden? (Nachteil: gr�ssere Dateigr�sse, Vorteil: Referenz f�r Anf�nger stets einfach verf�gbar) |
|---|
| 46 | bildschirmTastaturEinbinden := 1 |
|---|
| 47 | |
|---|
| 48 | ; Syntaxhinweis: IniRead, Variable, InputFilename, Section, Key [, DefaultValue] |
|---|
| 49 | |
|---|
| 50 | ; Soll der Treiber im Einhandmodus betrieben werden? |
|---|
| 51 | IniRead,einHandNeo,%ini%,Global,einHandNeo,0 |
|---|
| 52 | |
|---|
| 53 | ; Soll der Lernmodus aktiviert werden? |
|---|
| 54 | IniRead,lernModus,%ini%,Global,lernModus,0 |
|---|
| 55 | |
|---|
| 56 | ; Soll mit einer MsgBox explizit auf das Ein- und Ausschalten des Mod4-Locks hingewiesen werden? |
|---|
| 57 | IniRead,zeigeLockBox,%ini%,Global,zeigeLockBox,1 |
|---|
| 58 | |
|---|
| 59 | ; Soll aktivierter Mod4-Lock �ber die Rollen-LED des Keybord angezeigt werden (analog zu CapsLock)? |
|---|
| 60 | IniRead,UseMod4Light,%ini%,Global,UseMod4Light,1 |
|---|
| 61 | |
|---|
| 62 | ; Soll Lang-s auf s, s auf � und � auf Lang-s gelegt (bzw. vertauscht) werden? |
|---|
| 63 | IniRead,LangSTastatur,%ini%,Global,LangSTastatur,0 |
|---|
| 64 | If LangSTastatur |
|---|
| 65 | CharProc("LnS1") |
|---|
| 66 | else |
|---|
| 67 | KeyboardLED(2,"off") ; deaktivieren, falls sie doch brennt |
|---|
| 68 | |
|---|
| 69 | IniRead,isVM,%ini%,Global,isVM,0 |
|---|
| 70 | if (isVM) |
|---|
| 71 | CharProc("_VM1") |
|---|
| 72 | |
|---|
| 73 | ;Soll der Mod2Lock auch auf die Akzente, die Ziffernreihe und das Numpad angewandt werden? |
|---|
| 74 | ; Wird striktesMod2Lock auf 1 gesetzt, wirkt CapsLock wie ShiftLock |
|---|
| 75 | IniRead,striktesMod2Lock,%ini%,Global,striktesMod2Lock,0 |
|---|
| 76 | |
|---|
| 77 | |
|---|
| 78 | /*********************** |
|---|
| 79 | * Resourcen-Verwaltung * |
|---|
| 80 | ************************ |
|---|
| 81 | */ |
|---|
| 82 | if(FileExist("ResourceFolder")<>false){ |
|---|
| 83 | ; Versuche, alle m�glicherweise in die EXE eingebundenen Dateien zu extrahieren |
|---|
| 84 | FileInstall,neo_enabled.ico,%ResourceFolder%\neo_enabled.ico,1 |
|---|
| 85 | FileInstall,neo_disabled.ico,%ResourceFolder%\neo_disabled.ico,1 |
|---|
| 86 | iconBenutzen=1 |
|---|
| 87 | if (bildschirmTastaturEinbinden=1){ |
|---|
| 88 | FileInstall,ebene1.png,%ResourceFolder%\ebene1.png,1 |
|---|
| 89 | FileInstall,ebene2.png,%ResourceFolder%\ebene2.png,1 |
|---|
| 90 | FileInstall,ebene3.png,%ResourceFolder%\ebene3.png,1 |
|---|
| 91 | FileInstall,ebene4.png,%ResourceFolder%\ebene4.png,1 |
|---|
| 92 | FileInstall,ebene5.png,%ResourceFolder%\ebene5.png,1 |
|---|
| 93 | FileInstall,ebene6.png,%ResourceFolder%\ebene6.png,1 |
|---|
| 94 | zeigeBildschirmTastatur=1 |
|---|
| 95 | } |
|---|
| 96 | }else{ |
|---|
| 97 | MsgBox,"Das Verzeichnis %ResourceFolder% konnte nicht angelegt werden!" ; Diese Zeile dient nur der eventuellen Fehlersuche und sollte eigentlich niemals auftauchen. |
|---|
| 98 | } |
|---|
| 99 | |
|---|
| 100 | ; Benutze die Dateien auch dann, wenn sie eventuell im aktuellen Verzeichnis vorhanden sind |
|---|
| 101 | if(FileExist("ebene1.png")&&FileExist("ebene2.png")&&FileExist("ebene3.png")&&FileExist("ebene4.png")&&FileExist("ebene5.png")&&FileExist("ebene6.png")) |
|---|
| 102 | zeigeBildschirmTastatur=1 |
|---|
| 103 | if(FileExist("neo_enabled.ico")&&FileExist("neo_disabled.ico")) |
|---|
| 104 | iconBenutzen=1 |
|---|
| 105 | |
|---|
| 106 | /******************************************* |
|---|
| 107 | * �berpr�fung auf deutsches Tastaturlayout * |
|---|
| 108 | ******************************************** |
|---|
| 109 | */ |
|---|
| 110 | regread,inputlocale,HKEY_CURRENT_USER,Keyboard Layout\Preload,1 |
|---|
| 111 | regread,inputlocalealias,HKEY_CURRENT_USER,Keyboard Layout\Substitutes,%inputlocale% |
|---|
| 112 | if (inputlocalealias<>inputlocale=%inputlocalealias% and inputlocale<>00000407) { |
|---|
| 113 | suspend |
|---|
| 114 | regread,inputlocale,HKEY_LOCAL_MACHINE,SYSTEM\CurrentControlSet\Control\Keyboard Layouts\%inputlocale%,Layout Text |
|---|
| 115 | msgbox, 48, Warnung!, |
|---|
| 116 | ( |
|---|
| 117 | Nicht kompatibles Tastaturlayout: |
|---|
| 118 | `t%inputlocale% |
|---|
| 119 | `nDas deutsche QWERTZ muss als Standardlayout eingestellt |
|---|
| 120 | sein, damit %name% wie erwartet funktioniert. |
|---|
| 121 | `n�ndern Sie die Tastatureinstellung unter |
|---|
| 122 | `tSystemsteuerung |
|---|
| 123 | `t-> Regions- und Sprachoptionen |
|---|
| 124 | `t-> Sprachen |
|---|
| 125 | `t-> Details... `n |
|---|
| 126 | ) |
|---|
| 127 | exitapp |
|---|
| 128 | } |
|---|
| 129 | |
|---|
| 130 | /************************* |
|---|
| 131 | * Men� des Systray-Icons * |
|---|
| 132 | ************************** |
|---|
| 133 | */ |
|---|
| 134 | if (iconBenutzen) |
|---|
| 135 | menu,tray,icon,%ResourceFolder%\neo_enabled.ico,,1 |
|---|
| 136 | menu,tray,nostandard |
|---|
| 137 | menu,tray,add,�ffnen,open |
|---|
| 138 | menu,helpmenu,add,About,about |
|---|
| 139 | menu,helpmenu,add,Autohotkey-Hilfe,help |
|---|
| 140 | menu,helpmenu,add |
|---|
| 141 | menu,helpmenu,add,http://autohotkey.com/,autohotkey |
|---|
| 142 | menu,helpmenu,add,http://www.neo-layout.org/,neo |
|---|
| 143 | menu,tray,add,Hilfe,:helpmenu |
|---|
| 144 | menu,tray,add |
|---|
| 145 | menu,tray,add,%disable%,togglesuspend |
|---|
| 146 | menu,tray,add |
|---|
| 147 | menu,tray,add,Bearbeiten,edit |
|---|
| 148 | menu,tray,add,Neu Laden,reload |
|---|
| 149 | menu,tray,add |
|---|
| 150 | menu,tray,add,Nicht im Systray anzeigen,hide |
|---|
| 151 | menu,tray,add,%name% beenden, exitprogram |
|---|
| 152 | menu,tray,default,%disable% |
|---|
| 153 | menu,tray,tip,%name% |
|---|
| 154 | |
|---|
| 155 | /* |
|---|
| 156 | Sonstige Variablen |
|---|
| 157 | */ |
|---|
| 158 | guiErstellt := 0 |
|---|
| 159 | alwaysOnTop := 1 |
|---|
| 160 | isShiftRPressed := 0 |
|---|
| 161 | isShiftLPressed := 0 |
|---|
| 162 | isShiftPressed := 0 |
|---|
| 163 | isMod2Locked := 0 |
|---|
| 164 | IsMod3RPressed := 0 |
|---|
| 165 | IsMod3LPressed := 0 |
|---|
| 166 | IsMod3Pressed := 0 |
|---|
| 167 | IsMod4RPressed := 0 |
|---|
| 168 | IsMod4LPressed := 0 |
|---|
| 169 | IsMod4Pressed := 0 |
|---|
| 170 | IsMod4Locked := 0 |
|---|
| 171 | EbeneAktualisieren() |
|---|
| 172 | ; die Nachfolgenden sind n�tzlich um sich die Qwertz-Tasten abzugew�hnen, da alle auf der 4. Ebene vorhanden. |
|---|
| 173 | lernModus_std_Return := 0 |
|---|
| 174 | lernModus_std_Backspace := 0 |
|---|
| 175 | lernModus_std_PgUp := 0 |
|---|
| 176 | lernModus_std_PgDn := 0 |
|---|
| 177 | lernModus_std_Einf := 0 |
|---|
| 178 | lernModus_std_Entf := 0 |
|---|
| 179 | lernModus_std_Pos0 := 0 |
|---|
| 180 | lernModus_std_Ende := 0 |
|---|
| 181 | lernModus_std_Hoch := 0 |
|---|
| 182 | lernModus_std_Runter := 0 |
|---|
| 183 | lernModus_std_Links := 0 |
|---|
| 184 | lernModus_std_Rechts := 0 |
|---|
| 185 | lernModus_std_ZahlenReihe := 0 |
|---|
| 186 | |
|---|
| 187 | ; im folgenden kann man auch noch ein paar Tasten der 4. Ebene deaktivieren |
|---|
| 188 | ; n�tzlich um sich zu zwingen, richtig zu schreiben |
|---|
| 189 | lernModus_neo_Backspace := 0 |
|---|
| 190 | lernModus_neo_Entf := 1 |
|---|
| 191 | |
|---|
| 192 | |
|---|
| 193 | |
|---|
| 194 | EbeneAktualisieren() |
|---|
| 195 | { |
|---|
| 196 | global |
|---|
| 197 | Modstate := IsMod4Active() . IsMod3Active() |
|---|
| 198 | Ebene7 := 0 |
|---|
| 199 | Ebene8 := 0 |
|---|
| 200 | if (Modstate == "00") { ; Ebene 1 oder 2 |
|---|
| 201 | if (IsShiftActive()) ; Ebene 2: Shift oder CapsLock |
|---|
| 202 | Ebene := 2 |
|---|
| 203 | else ; Ebene 1: Ohne Mod oder CapsLock mit Shift |
|---|
| 204 | Ebene := 1 |
|---|
| 205 | if (IsShiftPressed) ; NC: Ebene 2: Shift (ignoriert CapsLock) |
|---|
| 206 | EbeneNC := 2 |
|---|
| 207 | else ; NC: Ebene 1: Ohne Mod (ignoriert CapsLock) |
|---|
| 208 | EbeneNC := 1 |
|---|
| 209 | } else if (Modstate == "01") { ; Ebene 3 oder 5 (ignoriert CapsLock) |
|---|
| 210 | if (IsShiftPressed) ; Ebene 5: Shift+Mod3 |
|---|
| 211 | Ebene := 5 |
|---|
| 212 | else ; Ebene 3: Mod3 |
|---|
| 213 | Ebene := 3 |
|---|
| 214 | EbeneNC := Ebene ; NC: gleich |
|---|
| 215 | } else if (Modstate == "10") { ; Ebene 4 (Mit Shift: Auch Ebene 7) (ignoriert CapsLock) |
|---|
| 216 | Ebene := 4 |
|---|
| 217 | if (IsShiftPressed) ; Ebene 7: Shift+Mod4 |
|---|
| 218 | Ebene7 := 1 |
|---|
| 219 | EbeneNC := Ebene ; NC: gleich |
|---|
| 220 | } else if (ModState == "11") { ; Ebene 6 (Mit Shift Xoder CapsLock: Auch Ebene 8) |
|---|
| 221 | Ebene := 6 |
|---|
| 222 | if (IsShiftPressed) ; Ebene 8: Shift (ignoriert CapsLock) |
|---|
| 223 | Ebene8 := 1 |
|---|
| 224 | EbeneNC := Ebene ; NC: gleich |
|---|
| 225 | } |
|---|
| 226 | } |
|---|
| 227 | |
|---|
| 228 | IsShiftActive() { |
|---|
| 229 | global |
|---|
| 230 | if (isMod2Locked) |
|---|
| 231 | if (isShiftPressed) |
|---|
| 232 | return 0 |
|---|
| 233 | else |
|---|
| 234 | return 1 |
|---|
| 235 | else |
|---|
| 236 | if (isShiftPressed) |
|---|
| 237 | return 1 |
|---|
| 238 | else |
|---|
| 239 | return 0 |
|---|
| 240 | } |
|---|
| 241 | |
|---|
| 242 | IsMod3Active() { |
|---|
| 243 | global |
|---|
| 244 | return isMod3Pressed |
|---|
| 245 | } |
|---|
| 246 | |
|---|
| 247 | IsMod4Active() { |
|---|
| 248 | global |
|---|
| 249 | if (isMod4Locked) |
|---|
| 250 | if (isMod4Pressed) |
|---|
| 251 | return 0 |
|---|
| 252 | else |
|---|
| 253 | return 1 |
|---|
| 254 | else |
|---|
| 255 | if (isMod4Pressed) |
|---|
| 256 | return 1 |
|---|
| 257 | else |
|---|
| 258 | return 0 |
|---|
| 259 | } |
|---|
| 260 | |
|---|
| 261 | /* |
|---|
| 262 | ------------------------------------------------------ |
|---|
| 263 | Methode KeyboardLED zur Steuerung der Keyboard-LEDs |
|---|
| 264 | (NumLock/CapsLock/ScrollLock-Lichter) |
|---|
| 265 | |
|---|
| 266 | Benutzungshinweise: Man benutze |
|---|
| 267 | KeyboardLED(LEDvalue,"Cmd"), wobei |
|---|
| 268 | Cmd = on/off/switch, |
|---|
| 269 | LEDvalue: ScrollLock=1, NumLock=2, CapsLock=4, |
|---|
| 270 | bzw. eine beliebige Summe dieser Werte: |
|---|
| 271 | AlleAus=0, CapsLock+NumLock=6, etc. |
|---|
| 272 | |
|---|
| 273 | Der folgende Code wurde �bernommen von: |
|---|
| 274 | http://www.autohotkey.com/forum/viewtopic.php?t=10532 |
|---|
| 275 | |
|---|
| 276 | Um eventuelle Wechselwirkungen mit dem bestehenden |
|---|
| 277 | Code (insb. der Unicode-Konvertierung) auszuschlie�en, |
|---|
| 278 | sind auch alle (Hilfsmethoden) mit dem Postfix LED |
|---|
| 279 | versehen worden. |
|---|
| 280 | ------------------------------------------------------ |
|---|
| 281 | */ |
|---|
| 282 | |
|---|
| 283 | KeyboardLED(LEDvalue, Cmd){ ; LEDvalue: ScrollLock=1, NumLock=2, CapsLock=4 ; Cmd = on/off/switch |
|---|
| 284 | Static h_device |
|---|
| 285 | If ! h_device ; initialise |
|---|
| 286 | { |
|---|
| 287 | device=\Device\KeyBoardClass0 |
|---|
| 288 | SetUnicodeStrLED(fn,device) |
|---|
| 289 | h_device:=NtCreateFileLED(fn,0+0x00000100+0x00000080+0x00100000,1,1,0x00000040+0x00000020,0) |
|---|
| 290 | } |
|---|
| 291 | VarSetCapacity(output_actual,4,0) |
|---|
| 292 | input_size=4 |
|---|
| 293 | VarSetCapacity(input,input_size,0) |
|---|
| 294 | If Cmd=switch ;switches every LED according to LEDvalue |
|---|
| 295 | KeyLED:=LEDvalue |
|---|
| 296 | If Cmd=on ;forces all choosen LED's to ON (LEDvalue= 0 ->LED's according to keystate) |
|---|
| 297 | KeyLED:=LEDvalue | (GetKeyState("ScrollLock", "T") + 2*GetKeyState("NumLock", "T") + 4*GetKeyState("CapsLock", "T")) |
|---|
| 298 | If Cmd=off ;forces all choosen LED's to OFF (LEDvalue= 0 ->LED's according to keystate) |
|---|
| 299 | { |
|---|
| 300 | LEDvalue:=LEDvalue ^ 7 |
|---|
| 301 | KeyLED:=LEDvalue & (GetKeyState("ScrollLock","T") + 2*GetKeyState("NumLock","T") + 4*GetKeyState("CapsLock","T")) |
|---|
| 302 | } |
|---|
| 303 | ; EncodeIntegerLED(KeyLED,1,&input,2) ;input bit pattern (KeyLED): bit 0 = scrolllock ;bit 1 = numlock ;bit 2 = capslock |
|---|
| 304 | input:=Chr(1) Chr(1) Chr(KeyLED) |
|---|
| 305 | input:=Chr(1) |
|---|
| 306 | input= |
|---|
| 307 | success:=DllCall("DeviceIoControl" |
|---|
| 308 | , "uint", h_device |
|---|
| 309 | , "uint", CTL_CODE_LED( 0x0000000b ; FILE_DEVICE_KEYBOARD |
|---|
| 310 | , 2 |
|---|
| 311 | , 0 ; METHOD_BUFFERED |
|---|
| 312 | , 0 ) ; FILE_ANY_ACCESS |
|---|
| 313 | , "uint", &input |
|---|
| 314 | , "uint", input_size |
|---|
| 315 | , "uint", 0 |
|---|
| 316 | , "uint", 0 |
|---|
| 317 | , "uint", &output_actual |
|---|
| 318 | , "uint", 0 ) |
|---|
| 319 | } |
|---|
| 320 | |
|---|
| 321 | CTL_CODE_LED(p_device_type,p_function,p_method,p_access ){ |
|---|
| 322 | Return, ( p_device_type << 16 ) | ( p_access << 14 ) | ( p_function << 2 ) | p_method |
|---|
| 323 | } |
|---|
| 324 | |
|---|
| 325 | NtCreateFileLED(ByRef wfilename,desiredaccess,sharemode,createdist,flags,fattribs){ |
|---|
| 326 | VarSetCapacity(fh,4,0) |
|---|
| 327 | VarSetCapacity(objattrib,24,0) |
|---|
| 328 | VarSetCapacity(io,8,0) |
|---|
| 329 | VarSetCapacity(pus,8) |
|---|
| 330 | uslen:=DllCall("lstrlenW","str",wfilename)*2 |
|---|
| 331 | InsertIntegerLED(uslen,pus,0,2) |
|---|
| 332 | InsertIntegerLED(uslen,pus,2,2) |
|---|
| 333 | InsertIntegerLED(&wfilename,pus,4) |
|---|
| 334 | InsertIntegerLED(24,objattrib,0) |
|---|
| 335 | InsertIntegerLED(&pus,objattrib,8) |
|---|
| 336 | status:=DllCall("ntdll\ZwCreateFile","str",fh,"UInt",desiredaccess,"str",objattrib,"str",io,"UInt",0,"UInt",fattribs |
|---|
| 337 | ,"UInt",sharemode,"UInt",createdist,"UInt",flags,"UInt",0,"UInt",0, "UInt") |
|---|
| 338 | return ExtractIntegerLED(fh) |
|---|
| 339 | } |
|---|
| 340 | |
|---|
| 341 | SetUnicodeStrLED(ByRef out, str_){ |
|---|
| 342 | VarSetCapacity(st1, 8, 0) |
|---|
| 343 | InsertIntegerLED(0x530025, st1) |
|---|
| 344 | VarSetCapacity(out, (StrLen(str_)+1)*2, 0) |
|---|
| 345 | DllCall("wsprintfW", "str", out, "str", st1, "str", str_, "Cdecl UInt") |
|---|
| 346 | } |
|---|
| 347 | |
|---|
| 348 | ExtractIntegerLED(ByRef pSource, pOffset = 0, pIsSigned = false, pSize = 4){ |
|---|
| 349 | ; pSource is a string (buffer) whose memory area contains a raw/binary integer at pOffset. |
|---|
| 350 | ; The caller should pass true for pSigned to interpret the result as signed vs. unsigned. |
|---|
| 351 | ; pSize is the size of PSource's integer in bytes (e.g. 4 bytes for a DWORD or Int). |
|---|
| 352 | ; pSource must be ByRef to avoid corruption during the formal-to-actual copying process |
|---|
| 353 | ; (since pSource might contain valid data beyond its first binary zero). |
|---|
| 354 | Loop %pSize% ; Build the integer by adding up its bytes. |
|---|
| 355 | result += *(&pSource + pOffset + A_Index-1) << 8*(A_Index-1) |
|---|
| 356 | if (!pIsSigned OR pSize > 4 OR result < 0x80000000) |
|---|
| 357 | return result ; Signed vs. unsigned doesn't matter in these cases. |
|---|
| 358 | ; Otherwise, convert the value (now known to be 32-bit) to its signed counterpart: |
|---|
| 359 | return -(0xFFFFFFFF - result + 1) |
|---|
| 360 | } |
|---|
| 361 | |
|---|
| 362 | InsertIntegerLED(pInteger, ByRef pDest, pOffset = 0, pSize = 4){ |
|---|
| 363 | ; The caller must ensure that pDest has sufficient capacity. To preserve any existing contents in pDest, |
|---|
| 364 | ; only pSize number of bytes starting at pOffset are altered in it. |
|---|
| 365 | Loop %pSize% ; Copy each byte in the integer into the structure as raw binary data. |
|---|
| 366 | DllCall("RtlFillMemory", "UInt", &pDest + pOffset + A_Index-1, "UInt", 1, "UChar", pInteger >> 8*(A_Index-1) & 0xFF) |
|---|
| 367 | } |
|---|
| 368 | |
|---|
| 369 | /* |
|---|
| 370 | ------------------------------------------------------ |
|---|
| 371 | Methoden zum Senden von Unicode-Zeichen |
|---|
| 372 | ------------------------------------------------------ |
|---|
| 373 | |
|---|
| 374 | �ber den GTK-Workaround: |
|---|
| 375 | Dieser basiert auf http://www.autohotkey.com/forum/topic32947.html |
|---|
| 376 | Der Aufruf von �SubStr(charCode,3)� geht davon aus, dass alle charCodes in Hex mit f�hrendem �0x� angegeben sind. Die abenteuerliche �^+u�-Konstruktion ben�tigt im �brigen den Hex-Wert in Kleinschrift, was derzeit nicht bei den Zeichendefinitionen umgesetzt ist, daher zentral und weniger fehlertr�chtig an dieser Stelle. Au�erdem ein abschlie�end gesendetes Space, sonst bleibt der �eingetippte� Unicode-Wert noch kurz sichtbar stehen, bevor er sich GTK-sei-dank in das gew�nschte Zeichen verwandelt. |
|---|
| 377 | */ |
|---|
| 378 | |
|---|
| 379 | SendUnicodeChar(charCode){ |
|---|
| 380 | IfWinActive,ahk_class gdkWindowToplevel |
|---|
| 381 | { |
|---|
| 382 | StringLower,charCode,charCode |
|---|
| 383 | send % "^+u" . SubStr(charCode,3) . " " |
|---|
| 384 | }else{ |
|---|
| 385 | VarSetCapacity(ki,28*2,0) |
|---|
| 386 | EncodeInteger(&ki+0,1) |
|---|
| 387 | EncodeInteger(&ki+6,charCode) |
|---|
| 388 | EncodeInteger(&ki+8,4) |
|---|
| 389 | EncodeInteger(&ki+28,1) |
|---|
| 390 | EncodeInteger(&ki+34,charCode) |
|---|
| 391 | EncodeInteger(&ki+36,4|2) |
|---|
| 392 | DllCall("SendInput","UInt",2,"UInt",&ki,"Int",28) |
|---|
| 393 | } |
|---|
| 394 | } |
|---|
| 395 | |
|---|
| 396 | SendUnicodeCharDown(charCode){ |
|---|
| 397 | IfWinActive,ahk_class gdkWindowToplevel |
|---|
| 398 | { |
|---|
| 399 | StringLower,charCode,charCode |
|---|
| 400 | send % "^+u" . SubStr(charCode,3) . " " |
|---|
| 401 | }else{ |
|---|
| 402 | VarSetCapacity(ki,28,0) |
|---|
| 403 | EncodeInteger(&ki+0,1) |
|---|
| 404 | EncodeInteger(&ki+6,charCode) |
|---|
| 405 | EncodeInteger(&ki+8,4) |
|---|
| 406 | |
|---|
| 407 | DllCall("SendInput","UInt",1,"UInt",&ki,"Int",28) |
|---|
| 408 | } |
|---|
| 409 | } |
|---|
| 410 | |
|---|
| 411 | SendUnicodeCharUp(charCode){ |
|---|
| 412 | IfWinActive,ahk_class gdkWindowToplevel |
|---|
| 413 | { |
|---|
| 414 | ; nothing |
|---|
| 415 | }else{ |
|---|
| 416 | VarSetCapacity(ki,28,0) |
|---|
| 417 | EncodeInteger(&ki+0,1) |
|---|
| 418 | EncodeInteger(&ki+6,charCode) |
|---|
| 419 | EncodeInteger(&ki+8,4|2) |
|---|
| 420 | |
|---|
| 421 | DllCall("SendInput","UInt",1,"UInt",&ki,"Int",28) |
|---|
| 422 | } |
|---|
| 423 | } |
|---|
| 424 | |
|---|
| 425 | EncodeInteger(ref,val){ |
|---|
| 426 | DllCall("ntdll\RtlFillMemoryUlong","Uint",ref,"Uint",4,"Uint",val) |
|---|
| 427 | } |
|---|
| 428 | |
|---|
| 429 | /********************** |
|---|
| 430 | * Tastenkombinationen * |
|---|
| 431 | *********************** |
|---|
| 432 | */ |
|---|
| 433 | |
|---|
| 434 | ~F24::return |
|---|
| 435 | |
|---|
| 436 | +pause:: |
|---|
| 437 | Suspend, Permit |
|---|
| 438 | goto togglesuspend |
|---|
| 439 | |
|---|
| 440 | /***************** |
|---|
| 441 | * Men�funktionen * |
|---|
| 442 | ****************** |
|---|
| 443 | */ |
|---|
| 444 | togglesuspend: |
|---|
| 445 | if A_IsSuspended { |
|---|
| 446 | menu, tray, rename, %enable%, %disable% |
|---|
| 447 | menu, tray, tip, %name% |
|---|
| 448 | if (iconBenutzen) |
|---|
| 449 | menu, tray, icon, %ResourceFolder%\neo_enabled.ico,,1 |
|---|
| 450 | suspend , off ; Schaltet Suspend aus -> NEO |
|---|
| 451 | } else { |
|---|
| 452 | menu, tray, rename, %disable%, %enable% |
|---|
| 453 | menu, tray, tip, %name% : Deaktiviert |
|---|
| 454 | if (iconBenutzen) |
|---|
| 455 | menu, tray, icon, %ResourceFolder%\neo_disabled.ico,,1 |
|---|
| 456 | suspend , on ; Schaltet Suspend ein -> QWERTZ |
|---|
| 457 | } |
|---|
| 458 | return |
|---|
| 459 | |
|---|
| 460 | help: |
|---|
| 461 | Run, %A_WinDir%\hh mk:@MSITStore:autohotkey.chm |
|---|
| 462 | return |
|---|
| 463 | |
|---|
| 464 | about: |
|---|
| 465 | msgbox, 64, %name% � Ergonomische Tastaturbelegung, |
|---|
| 466 | ( |
|---|
| 467 | %name% |
|---|
| 468 | `nDas Neo-Layout ersetzt das �bliche deutsche |
|---|
| 469 | Tastaturlayout mit der Alternative Neo, |
|---|
| 470 | beschrieben auf http://neo-layout.org/. |
|---|
| 471 | `nDazu sind keine Administratorrechte n�tig. |
|---|
| 472 | `nWenn Autohotkey aktiviert ist, werden alle Tastendrucke |
|---|
| 473 | abgefangen und statt dessen eine �bersetzung weitergeschickt. |
|---|
| 474 | `nDies geschieht transparent f�r den Anwender, |
|---|
| 475 | es muss nichts installiert werden. |
|---|
| 476 | `nDie Zeichen�bersetzung kann leicht �ber das Icon im |
|---|
| 477 | Systemtray deaktiviert werden. `n |
|---|
| 478 | ) |
|---|
| 479 | return |
|---|
| 480 | |
|---|
| 481 | neo: |
|---|
| 482 | run http://neo-layout.org/ |
|---|
| 483 | return |
|---|
| 484 | |
|---|
| 485 | autohotkey: |
|---|
| 486 | run http://autohotkey.com/ |
|---|
| 487 | return |
|---|
| 488 | |
|---|
| 489 | open: |
|---|
| 490 | ListLines ; shows the Autohotkey window |
|---|
| 491 | return |
|---|
| 492 | |
|---|
| 493 | edit: |
|---|
| 494 | edit |
|---|
| 495 | return |
|---|
| 496 | |
|---|
| 497 | reload: |
|---|
| 498 | Reload |
|---|
| 499 | return |
|---|
| 500 | |
|---|
| 501 | hide: |
|---|
| 502 | menu, tray, noicon |
|---|
| 503 | return |
|---|
| 504 | |
|---|
| 505 | exitprogram: |
|---|
| 506 | exitapp |
|---|
| 507 | return |
|---|
| 508 | |
|---|
| 509 | /************************** |
|---|
| 510 | * lernModus Konfiguration * |
|---|
| 511 | * nur relevant wenn * |
|---|
| 512 | * lernModus = 1 * |
|---|
| 513 | * Strg+Komma schaltet um * |
|---|
| 514 | *************************** |
|---|
| 515 | */ |
|---|
| 516 | ^,::lernModus := not(lernModus) |
|---|
| 517 | |
|---|
| 518 | ; 0 = aus, 1 = an |
|---|
| 519 | |
|---|
| 520 | ; LShift+RShift == CapsLock (simuliert) |
|---|
| 521 | ; Es werden nur die beiden Tastenkombinationen abgefragt, |
|---|
| 522 | ; daher kommen LShift und RShift ungehindert bis in die |
|---|
| 523 | ; Applikation. Dies ist aber merkw�rdig, da beide Shift- |
|---|
| 524 | ; Tasten nun /modifier keys/ werden und, wie in der AHK- |
|---|
| 525 | ; Hilfe beschrieben, eigentlich nicht mehr bis zur App |
|---|
| 526 | ; durchkommen sollten. |
|---|
| 527 | ; KeyboardLED(4,"switch") hatte ich zuerst genommen, aber |
|---|
| 528 | ; das schaltet, oh Wunder, die LED nicht wieder aus. |
|---|
| 529 | |
|---|
| 530 | ~*VKA1SC136:: |
|---|
| 531 | if (isShiftLPressed and !isShiftRPressed) |
|---|
| 532 | ToggleMod2Lock() |
|---|
| 533 | isShiftRPressed := 1 |
|---|
| 534 | isShiftPressed := 1 |
|---|
| 535 | EbeneAktualisieren() |
|---|
| 536 | return |
|---|
| 537 | |
|---|
| 538 | ~*VKA1SC136 up:: |
|---|
| 539 | isShiftRPressed := 0 |
|---|
| 540 | isShiftPressed := isShiftLPressed |
|---|
| 541 | EbeneAktualisieren() |
|---|
| 542 | return |
|---|
| 543 | |
|---|
| 544 | ~*VKA0SC02A:: |
|---|
| 545 | if (isShiftRPressed and !isShiftLPressed) |
|---|
| 546 | ToggleMod2Lock() |
|---|
| 547 | isShiftLPressed := 1 |
|---|
| 548 | isShiftPressed := 1 |
|---|
| 549 | EbeneAktualisieren() |
|---|
| 550 | return |
|---|
| 551 | |
|---|
| 552 | ~*VKA0SC02A up:: |
|---|
| 553 | isShiftLPressed := 0 |
|---|
| 554 | isShiftPressed := isShiftRPressed |
|---|
| 555 | EbeneAktualisieren() |
|---|
| 556 | return |
|---|
| 557 | |
|---|
| 558 | ToggleMod2Lock() { |
|---|
| 559 | global |
|---|
| 560 | if (isMod2Locked) |
|---|
| 561 | { |
|---|
| 562 | isMod2Locked := 0 |
|---|
| 563 | KeyboardLED(4,"off") |
|---|
| 564 | } |
|---|
| 565 | else |
|---|
| 566 | { |
|---|
| 567 | isMod2Locked := 1 |
|---|
| 568 | KeyBoardLED(4,"on") |
|---|
| 569 | } |
|---|
| 570 | } |
|---|
| 571 | |
|---|
| 572 | |
|---|
| 573 | *VKBFSC02B:: |
|---|
| 574 | if (isMod3LPressed and !isMod3RPressed) |
|---|
| 575 | CharStarDown("MOD3", "MOD3", "SComp") |
|---|
| 576 | isMod3RPressed := 1 |
|---|
| 577 | isMod3Pressed := 1 |
|---|
| 578 | EbeneAktualisieren() |
|---|
| 579 | return |
|---|
| 580 | |
|---|
| 581 | *VKBFSC02B up:: |
|---|
| 582 | if (isMod3LPressed) |
|---|
| 583 | CharStarUp("MOD3") |
|---|
| 584 | isMod3RPressed := 0 |
|---|
| 585 | isMod3Pressed := isMod3LPressed |
|---|
| 586 | EbeneAktualisieren() |
|---|
| 587 | return |
|---|
| 588 | |
|---|
| 589 | *VK14SC03A:: |
|---|
| 590 | if (isMod3RPressed and !isMod3LPressed) |
|---|
| 591 | CharStarDown("MOD3", "MOD3", "SComp") |
|---|
| 592 | isMod3LPressed := 1 |
|---|
| 593 | isMod3Pressed := 1 |
|---|
| 594 | EbeneAktualisieren() |
|---|
| 595 | return |
|---|
| 596 | |
|---|
| 597 | *VK14SC03A up:: |
|---|
| 598 | if (isMod3RPressed) |
|---|
| 599 | CharStarUp("MOD3") |
|---|
| 600 | isMod3LPressed := 0 |
|---|
| 601 | isMod3Pressed := isMod3RPressed |
|---|
| 602 | EbeneAktualisieren() |
|---|
| 603 | return |
|---|
| 604 | |
|---|
| 605 | ;Mod4+Mod4 == Mod4-Lock |
|---|
| 606 | ; Im Gegensatz zu LShift+RShift werden die beiden Tasten |
|---|
| 607 | ; _nicht_ zur Applikation weitergeleitet, und nur bei |
|---|
| 608 | ; gleichzeitigem Dr�cken wird der Mod4-Lock aktiviert und |
|---|
| 609 | ; angezeigt. |
|---|
| 610 | |
|---|
| 611 | *VKA5SC138:: |
|---|
| 612 | wasMod4RPressed := isMod4RPressed |
|---|
| 613 | isMod4RPressed := 1 |
|---|
| 614 | isMod4Pressed := 1 |
|---|
| 615 | EbeneAktualisieren() |
|---|
| 616 | if (isMod4LPressed and !wasMod4RPressed) |
|---|
| 617 | ToggleMod4Lock() |
|---|
| 618 | return |
|---|
| 619 | |
|---|
| 620 | *VKA5SC138 up:: |
|---|
| 621 | isMod4RPressed := 0 |
|---|
| 622 | isMod4Pressed := isMod4LPressed |
|---|
| 623 | EbeneAktualisieren() |
|---|
| 624 | return |
|---|
| 625 | |
|---|
| 626 | *VKE2SC056:: |
|---|
| 627 | wasMod4LPressed := isMod4LPressed |
|---|
| 628 | isMod4LPressed := 1 |
|---|
| 629 | isMod4Pressed := 1 |
|---|
| 630 | EbeneAktualisieren() |
|---|
| 631 | if (isMod4RPressed and !wasMod4LPressed) |
|---|
| 632 | ToggleMod4Lock() |
|---|
| 633 | return |
|---|
| 634 | |
|---|
| 635 | *VKE2SC056 up:: |
|---|
| 636 | isMod4LPressed := 0 |
|---|
| 637 | isMod4Pressed := isMod4RPressed |
|---|
| 638 | EbeneAktualisieren() |
|---|
| 639 | return |
|---|
| 640 | |
|---|
| 641 | ToggleMod4Lock() { |
|---|
| 642 | global |
|---|
| 643 | if (IsMod4Locked) { |
|---|
| 644 | IsMod4Locked := 0 |
|---|
| 645 | if (UseMod4Light) |
|---|
| 646 | KeyboardLED(1,"off") |
|---|
| 647 | if (zeigeLockBox) |
|---|
| 648 | MsgBox Mod4-Feststellung aufgehoben! |
|---|
| 649 | } else { |
|---|
| 650 | IsMod4Locked := 1 |
|---|
| 651 | if (UseMod4Light) |
|---|
| 652 | KeyboardLED(1,"on") |
|---|
| 653 | if (zeigeLockBox) |
|---|
| 654 | MsgBox Mod4 festgestellt: Um Mod4 wieder zu l�sen, dr�cke beide Mod4-Tasten gleichzeitig! |
|---|
| 655 | } |
|---|
| 656 | } |
|---|
| 657 | |
|---|
| 658 | /* |
|---|
| 659 | ------------------------------------------------------ |
|---|
| 660 | BildschirmTastatur |
|---|
| 661 | ------------------------------------------------------ |
|---|
| 662 | */ |
|---|
| 663 | |
|---|
| 664 | F1:: |
|---|
| 665 | if(isMod4Active() && zeigeBildschirmTastatur) |
|---|
| 666 | goto Switch1 |
|---|
| 667 | else send {blind}{F1} |
|---|
| 668 | return |
|---|
| 669 | |
|---|
| 670 | F2:: |
|---|
| 671 | if(isMod4Active() && zeigeBildschirmTastatur) |
|---|
| 672 | goto Switch2 |
|---|
| 673 | else send {blind}{F2} |
|---|
| 674 | return |
|---|
| 675 | |
|---|
| 676 | F3:: |
|---|
| 677 | if(isMod4Active() && zeigeBildschirmTastatur) |
|---|
| 678 | goto Switch3 |
|---|
| 679 | else send {blind}{F3} |
|---|
| 680 | return |
|---|
| 681 | |
|---|
| 682 | F4:: |
|---|
| 683 | if(isMod4Active() && zeigeBildschirmTastatur) |
|---|
| 684 | goto Switch4 |
|---|
| 685 | else send {blind}{F4} |
|---|
| 686 | return |
|---|
| 687 | |
|---|
| 688 | F5:: |
|---|
| 689 | if(isMod4Active() && zeigeBildschirmTastatur) |
|---|
| 690 | goto Switch5 |
|---|
| 691 | else send {blind}{F5} |
|---|
| 692 | return |
|---|
| 693 | |
|---|
| 694 | F6:: |
|---|
| 695 | if(isMod4Active() && zeigeBildschirmTastatur) |
|---|
| 696 | goto Switch6 |
|---|
| 697 | else send {blind}{F6} |
|---|
| 698 | return |
|---|
| 699 | |
|---|
| 700 | F7:: |
|---|
| 701 | if(isMod4Active() && zeigeBildschirmTastatur) |
|---|
| 702 | goto Show |
|---|
| 703 | else send {blind}{F7} |
|---|
| 704 | return |
|---|
| 705 | |
|---|
| 706 | F8:: |
|---|
| 707 | if(isMod4Active() && zeigeBildschirmTastatur) |
|---|
| 708 | goto ToggleAlwaysOnTop |
|---|
| 709 | else send {blind}{F8} |
|---|
| 710 | return |
|---|
| 711 | |
|---|
| 712 | Switch1: |
|---|
| 713 | tImage := ResourceFolder . "\ebene1.png" |
|---|
| 714 | goto Switch |
|---|
| 715 | Return |
|---|
| 716 | |
|---|
| 717 | Switch2: |
|---|
| 718 | tImage := ResourceFolder . "\ebene2.png" |
|---|
| 719 | goto Switch |
|---|
| 720 | Return |
|---|
| 721 | |
|---|
| 722 | Switch3: |
|---|
| 723 | tImage := ResourceFolder . "\ebene3.png" |
|---|
| 724 | goto Switch |
|---|
| 725 | Return |
|---|
| 726 | |
|---|
| 727 | Switch4: |
|---|
| 728 | tImage := ResourceFolder . "\ebene4.png" |
|---|
| 729 | goto Switch |
|---|
| 730 | Return |
|---|
| 731 | |
|---|
| 732 | Switch5: |
|---|
| 733 | tImage := ResourceFolder . "\ebene5.png" |
|---|
| 734 | goto Switch |
|---|
| 735 | Return |
|---|
| 736 | |
|---|
| 737 | Switch6: |
|---|
| 738 | tImage := ResourceFolder . "\ebene6.png" |
|---|
| 739 | goto Switch |
|---|
| 740 | Return |
|---|
| 741 | |
|---|
| 742 | SwitchDK: |
|---|
| 743 | tImage := ResourceFolder . "\deadkeys.png" |
|---|
| 744 | goto Switch |
|---|
| 745 | Return |
|---|
| 746 | |
|---|
| 747 | Switch: |
|---|
| 748 | if (guiErstellt) |
|---|
| 749 | { |
|---|
| 750 | if (Image = tImage) |
|---|
| 751 | goto Close |
|---|
| 752 | else |
|---|
| 753 | { |
|---|
| 754 | Image := tImage |
|---|
| 755 | SetTimer, Refresh |
|---|
| 756 | } |
|---|
| 757 | } |
|---|
| 758 | else |
|---|
| 759 | { |
|---|
| 760 | Image := tImage |
|---|
| 761 | goto Show |
|---|
| 762 | } |
|---|
| 763 | Return |
|---|
| 764 | |
|---|
| 765 | Show: |
|---|
| 766 | if (guiErstellt) |
|---|
| 767 | { |
|---|
| 768 | goto Close |
|---|
| 769 | } |
|---|
| 770 | else |
|---|
| 771 | { |
|---|
| 772 | if (Image = "") |
|---|
| 773 | { |
|---|
| 774 | Image := ResourceFolder . "\ebene1.png" |
|---|
| 775 | } |
|---|
| 776 | yPosition := A_ScreenHeight -270 |
|---|
| 777 | Gui, Color, FFFFFF |
|---|
| 778 | Gui, Add, Button, xm+5 gSwitch1, F1 |
|---|
| 779 | Gui, Add, Text, x+5, kleine Buchstaben |
|---|
| 780 | Gui, Add, Button, xm+5 gSwitch2, F2 |
|---|
| 781 | Gui, Add, Text, x+5, gro�e Buchstaben |
|---|
| 782 | Gui, Add, Button, xm+5 gSwitch3, F3 |
|---|
| 783 | Gui, Add, Text, x+5, Satz-/Sonderzeichen |
|---|
| 784 | Gui, Add, Button, xm+5 gSwitch4, F4 |
|---|
| 785 | Gui, Add, Text, x+5, Zahlen / Steuerung |
|---|
| 786 | Gui, Add, Button, xm+5 gSwitch5, F5 |
|---|
| 787 | Gui, Add, Text, x+5, Sprachen |
|---|
| 788 | Gui, Add, Button, xm+5 gSwitch6, F6 |
|---|
| 789 | Gui, Add, Text, x+5, Mathesymbole |
|---|
| 790 | Gui, Add, Button, xm+5 gShow, F7 |
|---|
| 791 | Gui, Add, Text, x+5, An / |
|---|
| 792 | Gui, Add, Text, y+3, Aus |
|---|
| 793 | Gui, Add, Button, x+10 y+-30 gShow, F8 |
|---|
| 794 | Gui, Add, Text, x+5, OnTop |
|---|
| 795 | Gui, Add, Button, xm+5 gSwitchDK, Deadkeys |
|---|
| 796 | Gui, Add, Picture,AltSubmit ys w729 h199 vPicture, %Image% |
|---|
| 797 | Gui, +AlwaysOnTop |
|---|
| 798 | Gui, Show, y%yposition% Autosize |
|---|
| 799 | ; SetTimer, Refresh |
|---|
| 800 | guiErstellt = 1 |
|---|
| 801 | } |
|---|
| 802 | Return |
|---|
| 803 | |
|---|
| 804 | Close: |
|---|
| 805 | guiErstellt = 0 |
|---|
| 806 | Gui, Destroy |
|---|
| 807 | Return |
|---|
| 808 | |
|---|
| 809 | Refresh: |
|---|
| 810 | If (Image != OldImage) |
|---|
| 811 | { |
|---|
| 812 | GuiControl, , Picture, %Image% |
|---|
| 813 | OldImage := Image |
|---|
| 814 | } |
|---|
| 815 | Return |
|---|
| 816 | |
|---|
| 817 | ToggleAlwaysOnTop: |
|---|
| 818 | if (alwaysOnTop) |
|---|
| 819 | { |
|---|
| 820 | Gui, -AlwaysOnTop |
|---|
| 821 | alwaysOnTop = 0 |
|---|
| 822 | } |
|---|
| 823 | else |
|---|
| 824 | { |
|---|
| 825 | Gui, +AlwaysOnTop |
|---|
| 826 | alwaysOnTop = 1 |
|---|
| 827 | } |
|---|
| 828 | Return |
|---|