Wyłączenie Capslocka w Windows 7, ignor. wielkich liter


(Mlody993) #1

Witam,

dzisiaj mam pytanie jak ignorować w Windows 7 wielkie litery, chodzi mi właściwie o klawisz Caps Lock, nie tyle żeby go wyłączyć, ale żeby Windows po prostu nie reagował czy jest on włączony czy wyłączony.

Skąd to pytanie?

Pisałem w tym temacie:

viewtopic.php?f=19&t=427199

Kupiłem klawiaturę Apple, i Capslock działa mi na odwrót ;/ Dokładniej chodzi o to, że denerwują mnie jakieś głupie diody, a ta klawiatura od Apple ma diodę na Caps Locku, że gdy jest włączony to się świeci dioda, u mnie się świeci ta dioda ale jak widać piszę małymi literami, gdy wcisnę Capslock dioda przestaje świecić, ale wtedy piszę wielkimi literami. Ja nie chce tej diody i dlatego pytanie. Jak zignorować Capslock, żeby niby według klawiatury był włączony, ale żebym pisał małymi literami.

W ogóle mi Capslock do życia nie potrzebny więc można go całkowicie wyłączyć, chociaż czasem może się przydać więc lepsze byłoby rozwiązanie, żeby to jakoś odwrócić. Jeżeli nie idzie odwrócić to jak go całkowicie wyłączyć?


(Hitm3n) #2

Idzie.

Tym programem :slight_smile:


(Mlody993) #3

Tak, właśnie coś na jego temat czytałem. Tylko czy to rozwiązanie mi pomoże w przypadku tej klawiatury? Że np. diodka na Capslock będzie się świecić - będą małe litery, diodka na Capslock będzie wyłączona - będą małe litery - zgadza się?

@edit:

Aha, nie idzie odwrócić tego?

Bo oryginalnie na tej klawiaturze od Apple diodka świeci się gdy jest Capslock włączony i wtedy piszemy duże litery...

U mnie jednak działa to na odwrót, diodka się świeci czyli "niby" Capslock jest włączony i mam małe litery, gdy rzekomo wyłączę Capslock (gaśnie dioda) to mam duże litery. :confused: Coś z Windą czy coś? Ale skoro się tak stało to chyba można to odwrócić?

Czyli po prostu w jakiś sposób odwrócić działanie Capslocka bądź jakiś skrypt który będzie działał w tle i po prostu będzie ignorował to, że mam włączony Capslock, ale nie ignorował klawisza Shift.

@edit2:

Pomyślałem o programie który używam od dawna, mianowicie Autohotkey. Dzięki niemu mógłbym to zrobić, jednak potrzebowałbym kogoś kto lepiej się zna na tym. Kiedyś ktoś mi pomagał z tym, ale kurcze kto... Teraz ciężko będzie znaleźć, ale chłopak na prawdę znał się na tym programie. :slight_smile:

Mam takie coś:

^q::

SetCapsLockState, AlwaysOn

return

To akurat teraz napisałem sam, po wciśnięciu CTRL + Q ustawiam, że Numlock jest CAŁYCZAS włączony, wtedy przestaje się świecić dioda i piszę dużymi literami, wciskam CapsLock i NIC, dioda się nie zapala czyli program skutecznie blokuje Capslock, ale pozostają TYLKO DUŻE LITERY.

Teraz by się przydało zrobić linijki, że A::a - czyli będzie zamieniać litery z dużej na małą, ale problem pozostaje taki, że przy użyciu SHIFTU także litera będzie mała. Czyli tutaj już ja nie mam pomysłu, ktoś kto się na tym zna na pewno będzie wiedział jaka jest reguła, żeby A zmieniło na a pod warunkiem, że jest włączony Capslock. Wtedy Capslock byłby przykładowo włączony, ale litery i tak małe. :slight_smile:


(pio_95) #4

Zdecydowanie za dużo pracy - bo i za dużo kombinowania.

Jedyne słuszne rozwiązanie, które przychodzi mi do głowy, to zastosowanie gotowych funkcji z

http://www.autohotkey.com/forum/topic10532.html


(Mlody993) #5

Wiesz jakoś nie mogę dojść do tego który kod wklepać do skryptu Autohotkey. Jak wybieram jakiś losowy np.:

~CapsLock::


  Sleep, 1 ; improve reliability of setting LED state sometimes

  If (GetKeyState("Capslock", "T"))

    KeyboardLED(4,"off")


Return

to po odpaleniu wyskakuje mi błąd. ;/ @edit: Jakbyś mógł mi pomóc chociaż z pierwszą literką to resztę zrobię sam. Ja próbowałem tak:

A::

Send, {CAPSLOCK down}a{CAPSLOCK up}

return

Problem powstaje taki, że wciskając A na włączonym Capslocku wpisuje się mała literka A, jednak nie przestaje i cały czas automatycznie jest pisane AAAAAAA do póki nie zatrzymam skryptu.

Czyli wszystko wyszło dobrze, jednak teraz potrzebuje linijkę kodu, który zatrzyma tą literkę A, czyli jedno wciśnięcie A - 1 literka na ekranie. Tylko jak to zrobić?

Gdybym to miał to wtedy analogicznie robię to z literami A-Z. :slight_smile:


(pio_95) #6

Praktycznie całość, z drobną zmianą (Pierwsze 3 linijki, reszta Kopiuj-wklej)

^q::

KeyboardLED(4, switch)

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) 

}

Nie jestem autorem skryptu (źródło można znaleźć w poprzednim poście), ale u mnie to rozwiązanie zadziałało. Nie mam też pewności, czy działa pod każdą klawiaturą.Alternatywne rozwiązanie - ominięcie problemu (niewskazane, ale na życzenie autora wątku...)

Trzeba rozwiązać problem zapętlania się programu. Najłatwiej będzie bezpośrednio wprowadzić znak, zamiast symulować zdarzenie klawiatury, które rozpoczyna kolejne wykonanie instrukcji spod hotkey'a ("wciska się sam", to niewskazane):

a::

Send {ASC 97}

return


+a::

Send {ASC 65}

return

chociaż to jest ominięcie problemu, a nie jego rozwiązanie.


(Mlody993) #7

Tak, co do mojego wyjścia to okej, sprawdzę zaraz to pierwsze.

Jeżeli to pierwsze nie działa to pozostaje drugie, jednak widzę, że w przypadku A odpowiada ASC 97, skąd wziąć te "nazwy" to pozostałych klawiszy?

@edit:

No i jak w przypadku reszty kodów z tego linku co podawałeś wyskakuje jakiś błąd. Przy Twoim kodzie jest to następujący błąd:

@edit2:

Ten drugi sposób na ominięcie, a nie rozwiązanie działa. Wystarczy, że teraz zrobię wszystko analogicznie dla każdej literki, tylko potrzebuję listę tych "nazw" ("A" to ASC 97).

Pomęczę się z tym, a gotowy skrypt udostępnię w razie gdyby ktoś miał też taki problem.

Aczkolwiek mile widziana pomoc do pierwszej opcji - rozwiązania problemu.

@edit3:

Zrobiłem wszystko od A do Z, jednak pozostał problem z Polskimi literkami, dałem:

!c::

send ASC 134 

return

i nic z tego, cały czas jest duża litera, muszę docisnąć SHIFT, żeby poszło. ;/


(Hitm3n) #8

Przy programie, który podałem, akcja jest do cofnięcia bez gadania i zbędnego programowania, klikasz tylko kilka razy i ot, Caps zablokowany, klikasz znowu i Caps odblokowany...


(Mlody993) #9

Oczywiście, ale ten program blokuje Capslock i nie mogę wyłączyć tej diody, bo nie wiem co się stało, ale wyłączony Capslock - dioda się świeci, Capslock włączony - dioda się nie świeci. No i gdy wyłączę Capslock tym programem to dioda się świeci i w ogóle jej nie mogę wyłączyć.


(Hitm3n) #10

To ja nie wiem, jak to jest, ale u mnie wszystko elegancko gra...

Może klawiatura Apple działa na jakiejś innej zasadzie, ja na klawiaturze laptopa i klawiaturze Logitech G11 nie mam problemu z zablokowaniem tego klawisza i jego diodą.


(Mlody993) #11

Heh, no to ja nie wiem.

Właśnie zauważyłem, że nie działa mi lewy Alt na tej klawiaturze Apple. ;x


(Hitm3n) #12

A może klawiatura jest po prostu kopnięta ;>


(pio_95) #13

A gdzie nawias?

send {ASC 134}

@edit:

Skopiowałem skrypt do poprzedniego postu jeszcze raz.


(Mlody993) #14

Tak, nawias był, jednak to nic nie daje. :frowning:

Co do skryptu, teraz się odpala bez problemu, jednak po wciśnięciu CTRL + Q nic się nie dzieje, Capslock nadal się świeci. Próbowałem także opcję on i off. Chyba lepiej będzie już tylko rozwiązać problem z Polskimi znakami, a właściwie z tym Shiftem w przypadku pisania Polskich znaków.

@edit:

Wie ktoś coś na temat tego Shifta w przypadku Polskich znaków?