Klawiatura ekranowa - przekazywanie zdarzeń między oknami

0

Witam

Zrobiłem jako User Control klawiaturę ekranową (program który piszę ma działać na terminalach dotykowych) składającą się z labela, textboxa i buttonów jako klawiszy. Sama obsługa podstawowych klawiszy odbywa się wewnątrz User Control tzn wprowadzany tekst trafia do textbox.
Jak zrobić żeby w momencie zdarzenia Click na klawiszu będącym odpowiednikiem entera tekst który jest wprowadzony został przekazany do np stringa lub textboxa w innym oknie aplikacji? Drugie pytanie - klawiatura ma mieć 2 opcje - wprowadzanie zwykłych wartości oraz wprowadzanie hasła - chciałbym w mojej klawiaturze ustalić coś na zasadzie flagi zwykła/hasło i w momencie wprowadzania hasła w textbox wyświetlać ** zamiast znaków a znaki przechowywać w stringu które później bym przekazał do aplikacji - jak rozwiązać komunikację w tą stronę czyli wywołując klawiaturę wysyłam info czy klawiatura zwykła czy do wprowadzania hasła.

0
  1. sendkeys
  2. to okienko (textbox) docelowe decyduje czy pokazuje znaki czy * a nie ten co wysyła do niego znaki!
0

abrakadaber, masz może jakiś przykład z kodem jak przekazywać sendkeys między okienkami ?
Co do textbox to tak jak pisałem, chciałem zrobić na zasadzie jakiejś flagi i gdyby klawiatura miałabyć na zasadzie wprowadzania hasła wtedy w metodzie dla kliku klawiszy wprowadziłbym że w treści wstawia * a dodatkowo miałbym string w którym przechowywałbym właściwe znaki i to tego stringa przekazywałbym później w odpowiednie miejsce. Jeśli źle kombinuję to zrobię drugą klawiaturę z passwordboxem zamiast textboxa.

1

wg mnie to w ogóle źle kombinujesz. Jeśli ma to być klawiatura ekranowa z prawdziwego zdarzenia (działać jak klawiatura ekranowa z windowsa np.) to tak ją trzeba napisać (inna sprawa czy pisanie własnej klawiatury ma sens). Jeśli natomiast ma to być po prostu komponent położony na formę aby dało się nim wpisywać znaki we własnych oknach to jest dużo prościej ale też nie tak jak próbujesz to zrobić. Po pierwsze sama idea wyświetlania wprowadzonego tekstu najpierw w textboxie, żeby go potem po zatwierdzeniu wysłać do jakiejś kontrolki jest zła.

Co do wysyłania textu do aktywnej kontrolki to
WinForms
Dodajesz klasę

public class ButtonEx : Button
    {
        [DefaultValue(true)]
        public bool Focusable
        {
            get { return GetStyle(ControlStyles.Selectable); }
            set { SetStyle(ControlStyles.Selectable, value); }
        }
    }

podmieniasz wszystkie System.Windows.Forms..Button na ButtonEx i ustawiasz Focusable = false,
w OnClick przycisku np. A dodajesz
SendKeys.Send("A");



**WPF**
Ustawiasz przyciskom, które robią za klawiaturę właściwość `Focusable` na `False`
Dla np. klawisza `A` piszesz następujący kod:
```csharp
var text = "A";
            var target = Keyboard.FocusedElement;
            var routedEvent = TextCompositionManager.TextInputEvent;

            target.RaiseEvent(
                new TextCompositionEventArgs(
                InputManager.Current.PrimaryKeyboardDevice,
                new TextComposition(InputManager.Current, target, text)) { RoutedEvent = routedEvent }
            );

Oczywiście trzeba to jakoś sensownie oprogramować (żeby nie pisać dla każdego przycisku takiego samego kodu), dodać obsługę SHIFT i P.ALT i masz gotowe :)

0

Dzięki, powalczę na podstawie tego co mi podałeś.
Co do idei - ma to być prosty komponent "imitujący" klawiaturę - to jest terminal produkcyjny i nie jest potrzebna pełna klawiatura. Nie są potrzebne wszystkie znaki, nie ma obsługi SHIFT i ALT o czym pisałeś. Generalnie ma to być uzupełnienie aktualnego systemu używanego na produkcji a co za tym idzie ma go przypominać żeby ludzie nie musieli uczyć się obsługi od nowa.
Większość jest wprowadzana przez inny komponent prostej imitacji klawiatury numerycznej, ta "pełna" jest wykorzystywana głównie do logowania i wyszukiwania zadań produkcyjnych.

Jaki prostszy sposób masz na myśli jeśli tak jak napisałem ma to być komponent imitujący klawiaturę? Generalnie ma to być w WPF żebym za pół roku nie musiał tego przepisywać na nowo.

1

trudniejszy to taki, gdzie klawiatura to osobna aplikacja, która pozwala wpisywać znaki w dowolnym okienku dowolnej aplikacji. Prostszy natomiast to taki, gdzie gotową klawiaturę (jako USerControl) kładzie się na własnej formatce, gdzie są np. okienka do wpisania loginu i hasła. Jeśli ten drugi sposób Ci wystarcza to praktycznie cały kod "klawiatury" masz podany wyżej. Pozostaje jedynie sensownie przypisać poszczególnym klawiszom odpowiednie znaki do wpisania.

Masz w załączniku przykładowy kod i exe jak to działa

0

Dzięki za kod i program. U mnie ma to działać w ten sposób że jest okno główne terminala na którym są przyciski odpowiadające operatorom - na każdym przycisku imię nazwisko operatora. Gdy operator chce się zalogować to klika w przycisk ze swoim imieniem i nazwiskiem i wtedy wyskakuje klawiatura z której wprowadza hasło - klawiatura ma być osobnym oknem. Mój pomysł był taki że tworzę UserControl w którym jest właśnie klawiatura, kompiluję do dll i później wykorzystuję w dalszych projektach.

To co posłałeś jest ok ale nie w moim przypadku gdzie z innego okna wybiera się operatora a klawiatura ma się pokazać później w takiej formie jak na załączonym zdjęciu - tak userzy nauczyli się przez lata i interface musi być w ten sposób odwzorowany.

Co do metody na kliknięcie to też myślałem żeby w tym celu wykorzystać tag buttona i zrobić uniwersalną metodę dla zwykłych klawiszy. Mam tylko problem jak w tym moim rozwiązaniu przekazać z tego UserControl którego upchnąłem do dll-ki dane do innego pola a raczej jak przekazać info do UserControl z klawiaturą że jak klikniemy na niej Enter to ma wysłać wprowadzone dane do odpowiedniego stringa który później porównuję z hasłem w bazie danych

1 użytkowników online, w tym zalogowanych: 0, gości: 1