Jak zablokować wciśnięcie klawisza?

dział ogólny

Jak zablokować wciśnięcie klawisza?

Nowy 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
    Windows VistaFirefox

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

Nowy 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
    Windows XPFirefox

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

Nowy 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
    Windows VistaFirefox

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

Nowy 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
    Windows XPFirefox

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

Nowy 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
    Windows VistaFirefox

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

Nowy 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
    Windows XPFirefox

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

Nowy 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
    Windows VistaFirefox

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

Nowy 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
    Windows XPFirefox

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

Nowy 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ć.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
kurczez
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
    Windows XPFirefox

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

Nowy 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
    Windows VistaFirefox

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

Nowy 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
    Windows XPFirefox

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

Nowy 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
    Windows XPFirefox

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

Nowy postprzez Cyfrowy Baron » środa, 20 stycznia 2010, 20:39

Wątek został oczyszczony z jałowych i zbędnych wypowiedzi zaśmiecających forum.
Na przyszłość, jeżeli ktoś odczuwa potrzebę wyładowania z siebie agresji to niech zakłada wątki w dziale Dyskusja.

Wątek został w całości przekopiowany do działu Dyskusja, więc jeżeli ktoś chce się jeszcze wyżalić to może to zrobić tutaj.
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
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

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