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.
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ć?
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. 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.
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.
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.
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):
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. ;/
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…
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ć.
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ą.
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?