Jak zablokować wciśnięcie klawisza?

Dyskusje na dowolny temat.

Jak zablokować wciśnięcie klawisza?

Postprzez kurczez » wtorek, 19 stycznia 2010, 13:55

Hej, chciałbym aby TMemo nie reagowało na naciśnięcie wybranego klawisza. Np. gdy nacisnę na "a" to wbija się "a", ale gdy nacisnę na zablokowany klawisz "b" to nie zostanie od wpisany.
Coś czuje, że trzeba przechwycić komunikaty klawiatury z WinApi i je jakoś zablokować, ma ktoś jakieś sugestie?
Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez Cyfrowy Baron » wtorek, 19 stycznia 2010, 14:20

Możesz posłużyć się zdarzeniem OnKeyPress dla obiektu Memo.

Ponieważ nie uzupełniłeś swojego profilu, więc nie wiem w jakim środowisku programujesz dlatego podaję kod dla środowiska C++Builder 2009 i 2010:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TForm1::Memo1KeyPress(TObject *Sender, wchar_t &Key)
{
   wchar_t keyString[3];
   keyString[0] = Key;
   wcscpy(&keyString[1], L"b");
   wcscpy(&keyString[2], L"e");

   for(int i = 1; i < sizeof(keyString)/2; i++)
   {
    if(Key == keyString[i]) Key = NULL;
   }
}
//---------------------------------------------------------------------------


Zablokowane zostaną litery b B e E, gdyż wielkość liter nie gra tutaj roli. Rozmiar zmiennej keyString został ustawiony na 3, gdyż tylko trzy litery ma przechowywać, ustal ten rozmiar w zależności od liczby blokowanych liter, czyli rozmiar = liczba blokowanych liter + 1;
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez kurczez » wtorek, 19 stycznia 2010, 14:37

Dzięki, działa ale są problemy z pl znakami typu ł, ś.

Edit: uzupełniłem profil, używam Turbo C++ pro.
Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez Cyfrowy Baron » wtorek, 19 stycznia 2010, 14:48

Jak pisałem, to kod dla C++Builder 2009 i 2010, dla Turbo C++ pewnie powinno być tak jak dla wcześniejszych wersji C++Builder'a, czyli trzeba zastąpić typ wchar_t typem char, gdyż jak zauważysz wartość Key argumentu funkcji OnKeyPress jest typu char:

Kod: Zaznacz cały
void __fastcall TForm1::Memo1KeyPress(TObject *Sender, char &Key)
{
    char keyString[3];
    keyString[0] = Key;
    strcpy(&keyString[1], "ł");
    strcpy(&keyString[2], "ś");

    for(unsigned i = 1; i < sizeof(keyString); i++) /* sizeof(keyString) a nie sizeof(keyString)/2 */
    {
      if(Key == keyString[i]) Key = NULL;
    }   
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez kurczez » wtorek, 19 stycznia 2010, 14:54

Zgadza się, jest typu char, ale nadal nie działa.

Na ifie zmienne mają wartości:

Key = '\x01'
keyString[i] = ł

Kod: Zaznacz cały
    char keyString[3];
   keyString[0] = Key;
   strcpy(&keyString[1], "ł");
   strcpy(&keyString[2], "ś"); // Po wykonaniu tej linijki kodu zmienna Key zmienia wartość z "f" na '\x01' :|

   for(unsigned i = 1; i < sizeof(keyString); i++) /* sizeof(keyString) a nie sizeof(keyString)/2 */
   {
     if(Key == keyString[i]) Key = NULL;
   }   
Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez Cyfrowy Baron » wtorek, 19 stycznia 2010, 15:07

A na pewno umieściłeś ten kod w zdarzeniu OnKeyPress a nie w zdarzeniu OnKeyDown lub OnKeyUp?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez kurczez » wtorek, 19 stycznia 2010, 15:07

Tak, sprawdzałem 2 razy.
Przeczytaj mój komentarz w wklejonym kodzie, dzieje tam się coś dziwnego. Nagle zmienna sama zmienia wartość.

Wklejam cały kod zdarzenia:

Kod: Zaznacz cały
void __fastcall TForm2::Memo10KeyPress(TObject *Sender, char &Key)
{
    char keyString[3];
   keyString[0] = Key;
   strcpy(&keyString[1], "ł");
   strcpy(&keyString[2], "ś");

   for(unsigned i = 1; i < sizeof(keyString); i++) /* sizeof(keyString) a nie sizeof(keyString)/2 */
   {
     if(Key == keyString[i]) Key = NULL;
   }   
}
Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez Cyfrowy Baron » wtorek, 19 stycznia 2010, 15:16

Zmienna sama niczego nie zmienia, to funkcja strcpy tak zapisuje znak. Spróbuj z funkcja StrCopy jeżeli takowa występuje w bibliotekach Turbo C++:

Kod: Zaznacz cały
void __fastcall TForm1::Memo1KeyPress(TObject *Sender, char &Key)
{
   char keyString[3];
   keyString[0] = Key;

   StrCopy(&keyString[1], "ł");
   StrCopy(&keyString[2], "ś");

   for(unsigned i = 1; i < sizeof(keyString); i++)
   {
    if(Key == keyString[i]) Key = NULL;
   }
}


Chociaż to pewnie niczego nie zmieni, ale nigdy nie korzystałem z Turbo C++, więc nie wiem jak to tam jest z funkcjami.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez Cyfrowy Baron » wtorek, 19 stycznia 2010, 15:22

Spróbuj zamiast strcpy funkcji strncpy:

Kod: Zaznacz cały
void __fastcall TForm1::Memo1KeyPress(TObject *Sender, char &Key)
{
   char keyString[3];
   keyString[0] = Key;

   strncpy(&keyString[1], "ł", 1);
   strncpy(&keyString[2], "ś", 1);

   for(unsigned i = 1; i < sizeof(keyString); i++)
   {
    if(Key == keyString[i]) Key = NULL;
   }
}




Korzystasz z Windows Vista, więc to może być związane z systemem, ale tego też nie mogę sprawdzić.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez kurczez » wtorek, 19 stycznia 2010, 15:36

Dzięki, zadziałało z strncpy.
Orientujesz się czy program korzystający z tej funkcji uruchomiony na XP będzie działał prawidłowo?
Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez Cyfrowy Baron » wtorek, 19 stycznia 2010, 15:47

Będzie działał, gdyż strncpy sprawdza się dokładnie tak samo jak strcpy, a jak widzisz ja korzystam z WindowsXP.



Co do Visty to jest już Windows 7, a to taka poprawiona Vista, o niebo lepszy od Visty, chociaż poza zmianami w wyglądzie nie różnie się wiele od Windows XP, więc może czas zmienić system.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez kurczez » wtorek, 19 stycznia 2010, 15:52

Słyszałem dobre opinie o Windows 7 i pomału przymierzam się do zmiany kompa na nowego już w win7.
Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez polymorphism » wtorek, 19 stycznia 2010, 15:53

Panowie, litości!
Kod: Zaznacz cały
void __fastcall TForm1::Memo1KeyPress(TObject *Sender, char &Key)
{
     if(strchr("łśćż",Key))Key = 0;
}





Kod: Zaznacz cały
strncpy(&keyString[1], "ł", 1);
strncpy(&keyString[2], "ś", 1);
A nie można po prostu:
Kod: Zaznacz cały
strncpy(keyString + 1,"łś",2);

lub nawet:
Kod: Zaznacz cały
keyString[1] = 'ł';
keyString[2] = 'ś';

:?:
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez kurczez » wtorek, 19 stycznia 2010, 16:12

polymorphism: skoro pytam o raczej nie skomplikowane rzeczy to oczekuje odpowiedzi na moim poziomie. Co z tego, że Baron zapisze to w 1 linijce jak mi to nic nie będzie mówić.
Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    NieznanyNieznana

Re: Jak zablokować wciśnięcie klawisza?

Postprzez polymorphism » wtorek, 19 stycznia 2010, 16:24

Poziom skomplikowania kodu w mojej odpowiedzi jest niższy od tego z odpowiedzi Barona, ogranicza się do wywołania jednej funkcji, więc nie wiem o czym piszesz. Wystarczyłoby jakbyś wpisał w google nazwę tej funkcji, wtedy wiedziałbyś jak to działa.

Zresztą mojej uwagi nie kierowałem tylko do Ciebie.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Dyskusje

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron