Czy istnieje możliwość pułapkowania wszystkich zdarzeń klawiatury w mojej aplikacji? Muszę wiedzieć, czy użytkownik wprowadza cokolwiek za pomocą klawiatury w mojej aplikacji (aplikacja ma wiele widoków). Udało mi się uchwycić touchEvents, dzieląc podklasę na UIWindow, ale nie mogłem przechwytywać zdarzeń na klawiaturze.Odbieranie zdarzeń klawiatury iPhone'a
Odpowiedz
Zastosowanie NSNotificationCenter
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyPressed:) name: UITextFieldTextDidChangeNotification object: nil];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyPressed:) name: UITextViewTextDidChangeNotification object: nil];
........
-(void) keyPressed: (NSNotification*) notification
{
NSLog([[notification object]text]);
}
Nie jest to prosta odpowiedź, ale wydaje mi się, że dostępne są dwa podejścia.
podklasa elementy wejściowe (UITextView, UITextField, etc), jak zrobiłeś z UIWindow.
Utwórz aplikację szerokim UITextViewDelegate (i UITextFieldDelegate) i przypisz do niego wszystkich swoich uczestników.
pisałem o przechwytywanie zdarzeń używając trochę hack UIEvent w moim blogu
Patrz: Catching Keyboard Events in iOS szczegóły.
Od powyższej blogu:
Sztuką jest w dostępie do pamięci GSEventKey struct bezpośrednio i sprawdzić pewne bajty znać kod dostępu i flagami wciśniętego klawisza. Poniżej kod jest prawie oczywisty i należy go umieścić pod swoją podklasą UIApplication .
#define GSEVENT_TYPE 2
#define GSEVENT_FLAGS 12
#define GSEVENTKEY_KEYCODE 15
#define GSEVENT_TYPE_KEYUP 11
NSString *const GSEventKeyUpNotification = @"GSEventKeyUpHackNotification";
- (void)sendEvent:(UIEvent *)event
{
[super sendEvent:event];
if ([event respondsToSelector:@selector(_gsEvent)]) {
// Key events come in form of UIInternalEvents.
// They contain a GSEvent object which contains
// a GSEventRecord among other things
int *eventMem;
eventMem = (int *)[event performSelector:@selector(_gsEvent)];
if (eventMem) {
// So far we got a GSEvent :)
int eventType = eventMem[GSEVENT_TYPE];
if (eventType == GSEVENT_TYPE_KEYUP) {
// Now we got a GSEventKey!
// Read flags from GSEvent
int eventFlags = eventMem[GSEVENT_FLAGS];
if (eventFlags) {
// This example post notifications only when
// pressed key has Shift, Ctrl, Cmd or Alt flags
// Read keycode from GSEventKey
int tmp = eventMem[GSEVENTKEY_KEYCODE];
UniChar *keycode = (UniChar *)&tmp;
// Post notification
NSDictionary *inf;
inf = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithShort:keycode[0]],
@"keycode",
[NSNumber numberWithInt:eventFlags],
@"eventFlags",
nil];
[[NSNotificationCenter defaultCenter]
postNotificationName:GSEventKeyUpNotification
object:nil
userInfo:userInfo];
}
}
}
}
}
. Zobacz ["Jak mogę napisać odpowiedź, która poprawnie łączy się z zasobem zewnętrznym?"] (Http://meta.stackexchange.com/questions/94022/how-could -i-write-my-answer-that-links-to-an-external-resource-poprawnie). –
Nie rozumiem, co mam -1. Tak, link do posta mojego bloga, ale w pełni odpowiada na to pytanie. Łapie WSZYSTKIE zdarzenia na klawiaturze, w tym Shift, Cmd, Ctrl, Alt. Jeśli jest tak ze względu na używanie prywatnych API, wyraźnie stwierdziłem, że jest to ** hack **. Nie kłuję nikogo tutaj. – nacho4d
Prawdopodobnie dlatego, że twoja odpowiedź nie odpowiada na pytanie, po prostu wskazuje na zewnętrzne źródło, które może zniknąć, zepsuć się lub po prostu zmienić to pytanie. Jak wskazuje Anna Lear, przeczytaj sekcję, którą wskazała. Odpowiedzią na poniższe zasady są następujące zasady: - parafrazujesz zawartość połączonego elementu (ewentualnie pomijając szczegóły lub przykłady) - identyfikujesz autora (siebie, MSDN, itp.) - ktoś może skorzystać z odpowiedź bez czytania połączonego elementu w ogóle - podajesz informacje, które pozwolą czytelnikowi zdecydować, czy kliknięcie linku jest warte zachodu. – Coyote
- 1. Rejestr zdarzeń drugiej klawiatury
- 2. Wysyłanie zdarzeń myszy i klawiatury
- 3. Generowanie zdarzeń klawiatury dla aplikacji frontowej
- 4. uzyskiwanie zdarzeń klawiatury bez ustawienia okna
- 5. Konieczność przechwycenia zdarzeń klawiatury HID (a następnie ich zablokowanie)
- 6. Przekazywanie zdarzeń klawiatury z jednego kontrolki Windows do innego
- 7. Scala: Odbieranie Server-Sent-Events
- 8. Zbieranie i odbieranie śmieci
- 9. Odbieranie zdarzenia dwukrotnego kliknięcia
- 10. Selektywne odbieranie w Erlang
- 11. Jak testować zdarzenia klawiatury jQuery?
- 12. Typ wejściowy klawiatury klawiatury iOS z przecinkiem
- 13. Błąd Odbieranie emisji intencji Problem
- 14. iOS: Odbieranie mediów w tle
- 15. Odbieranie intencji ACTION_SEND z galerii
- 16. asmack - odbieranie niestandardowych wiadomości XML ||
- 17. wysyłanie/odbieranie danych przez Bluetooth
- 18. Odbieranie CommandParameter wartość w MVVM
- 19. Odbieranie obrazu za pośrednictwem websocket
- 20. Odbieranie DTMF w systemie Android
- 21. Czy mogę używać języka Python do przechwytywania zdarzeń klawiatury i myszy w systemie OSX?
- 22. Upewnij się, że moja gra XNA jest aktywna przed obsługą zdarzeń myszy i klawiatury.
- 23. Powolna reakcja klawiatury na aplikację iOS Cordova
- 24. Hermetyzacja zdarzeń z Enums
- 25. Monitorowanie zdarzeń globalnych NSEvent w tle
- 26. Wykrywanie klawiatury iPada hide versus podłączenie klawiatury zewnętrznej?
- 27. Aplikacja zawiesza się podczas zmiany języka klawiatury klawiatury wejściowej Windows
- 28. Lista kodów skanowania klawiatury hex i dokumentacja klawiatury USB HID
- 29. iOS 11 - Wysokość klawiatury powraca 0 w powiadomieniu klawiatury
- 30. Android: Wykrywanie nieaktywności użytkownika/Wykrywanie klawiatury (z klawiatury programowej)
To jest trochę trudne i teraz obejmuje wiele pracy. Miałem nadzieję, że zobaczę zdarzenie na poziomie aplikacji, aby uchwycić – iamMobile