Aplikacja desktop (WinForms) - klawiatura ekranowa

Aplikacja desktop (WinForms) - klawiatura ekranowa
AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2157
0

Witam.
Piszę, aby się zapytać jaki jest najlepszy, albo dobry sposób na stworzenie klawiatury numerycznej. Od razu zaznaczam, że nie mogę wywołać systemowej klawiatury, ponieważ niektóre .dll nie działają na 64-bit i aplikacja się nie kompiluje. Myślałem nad dodatkową formą, którą wywołam sobie na focusie, ale problem jest, że focus z kontrolki znika... Co prawda najczęściej potrzebna jest numeryczna, ale jeśli zrobię jedną całą to też będzie dobrze.
A może są jakieś NuGet'owe dodatki do C#, które mają już taką klawiaturę?

PS.
Mam DevExpressa. Może będzie więcej możliwości.

SZ
  • Rejestracja:prawie 11 lat
  • Ostatnio:dzień
  • Postów:1473
1

Zainteresuj się SendKeys. Też kiedyś miałem podobny problem. Nie znalazłem nic wartego uwagi ale też nie jest trudne to napisać samemu. Ja rozwiązałem to mniej więcej tak: Przy kliknięciu na textbox np ustawiałem sobie gdzieś w jakiejś klasie (np singletonie) referencje na te kontrolke. Następnie jak naciskałem button na klawiaturze (tej wirtualnej) to metodzie OnClick robiłem Focus na ostatnio wybranym Textboxie i potem wywoływałem SendKeys.Send(jakaślitera). Miałem obsługę pełną klawiatury.

edytowany 1x, ostatnio: szydlak
AF
  • Rejestracja:prawie 18 lat
  • Ostatnio:18 dni
0
AdamWox napisał(a):

Od razu zaznaczam, że nie mogę wywołać systemowej klawiatury, ponieważ niektóre .dll nie działają na 64-bit i aplikacja się nie kompiluje.

Możesz rozwinąć? Klawiatura ekranowa w Windowsie jest zwykłą aplikacją w systemie, odpalasz osk.exe i śmiga.

AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2157
0

Możesz rozwinąć? Klawiatura ekranowa w Windowsie jest zwykłą aplikacją w systemie, odpalasz osk.exe i śmiga.

No właśnie nie. Trzeba w ustawieniach projektu ustawić na x64, bo na x86 i Any CPU nie włącza klawiatury.

AF
  • Rejestracja:prawie 18 lat
  • Ostatnio:18 dni
0
AdamWox napisał(a):

No właśnie nie. Trzeba w ustawieniach projektu ustawić na x64, bo na x86 i Any CPU nie włącza klawiatury.

Kopiuj
Process.Start("osk.exe");

Działa na Windows Server 2012 R2 kompilowane jako Any CPU, odpala klawiaturę poprawnie. Mam wrażenie, że robisz coś źle, ale bez kodu i szczegółów środowiska nie da się powiedzieć.

AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2157
0

Windows 10 Any CPU Debug, to samo w Release

Kopiuj
private void simpleButton1_Click(object sender, EventArgs e)
{
     Process.Start("osk.exe");
}
Kopiuj
System.ComponentModel.Win32Exception (0x80004005): Nie można odnaleźć określonego pliku

Calling the on-screen keyboard using a button in C#

AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2157
0

@szydlak:
Dlaczego akurat SendKeys? Nie prościej jest wziąć po prostu btn.Text i dopisywać do pozycji kursora? Nie twierdze, że próbowałem, ale serio trzeba zrobić faktyczne naciśnięcie klawisza?

SZ
  • Rejestracja:prawie 11 lat
  • Ostatnio:dzień
  • Postów:1473
0

Bo potrzebowałem backspace i space używać.Poza tym jeśli naciśniesz przycisk klawisza to textbox traci focus, jak chcesz odczytać pozycje kursora?

edytowany 2x, ostatnio: szydlak
AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2157
0

No tak, to ma sens. W jakim miejscu tą klawiaturę wyświetlałeś? Na środku formy, czy raczej relatywnie do kontrolki, która ją wywoływała? Czy wywołanie klawiatury na Click w TextBox jest tym samym co dotknięcie na ekranie dotykowym?

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 godziny
0

Microsoft coś skopał że w 64-bitowym Windows 10 brakuje 32-bitowej wersji osk.exe, a do 64-bitowej (którą powinno się dać normalnie odpalić) nie ma bezpośredniego dostępu bo ścieżka c:\windows\system32 jest w 32-bitowych aplikacjach przekierowana…

Można by spróbować napisać małego 64-bitowego exeka którego jedynym zadaniem będzie odpalenie osk.exe. Ten exek leżałby razem z exekiem naszej 32-bitowej aplikacji.

Kopiuj
        private void button1_Click( object sender, EventArgs e )
        {
            Process.Start( Application.StartupPath + "\\runosk.exe" );
        }

gdzie runosk.exe robi coś takiego:

Kopiuj
public class ProgramRunOsk
{
    public static void Main()
    {
        System.Diagnostics.Process.Start( "osk.exe" );
    }
}

i ma ustawione x64.
Ale wtedy nasz 32-bitowy program się nie uruchomi na 32-bitowym systemie, a przecież powinien.
Trzeba by dodać sprawdzanie przez zaimportowanie funkcji WinAPI IsWow64Process, i jeśli zwraca false to odpalać bezpośrednio osk.exe, a jeśli true to przez runosk.exe.

edytowany 3x, ostatnio: Azarien
SZ
  • Rejestracja:prawie 11 lat
  • Ostatnio:dzień
  • Postów:1473
0

No ja to właśnie robiłem na dotykowy :D.(Miałem zakaz używania klawiatury systemowej) Zrobiłem UserControl (moja klawiatura), który dodawałem tam gdzie potrzebowałem w aplikacji. Np na formularzu, gdzie były texboxy na górze a na dole moja klawiatura wyśrodkowana, Miałem pełną klawiaturę więc zajmowała całą szerokość ekranu, (klawisze musiały być większe ze względu na dotyk)

AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2157
0

@Azarien:
No jest ewidentnie coś pokręcone w Windows 10, stąd też koledze @Afish na Windows Server zadziałało. Wydaje mi się, że Microsoft powoli rezygnuje z 32bit stąd też przyzwyczaja wszystkich do x64 w pisanych aplikacjach, a robi to po cichu, jak większość zresztą.

AF
  • Rejestracja:prawie 18 lat
  • Ostatnio:18 dni
0

Ciągle próbujesz rozwiązać zły problem. Skoro 32 bitowa wersja osk nie chce działać, to odpal 64-bitową i po sprawie:

Kopiuj
Process.Start(@"c:\Windows\Sysnative\cmd.exe", "/c osk.exe");

Testowane na Windows 10 1703 Enterprise x64 z aplikacji kompilowanej w VS 2015 na .NET 4.5 jako Any CPU. Działa też na wspomnianym wcześniej Windows Serverze 2012 R2.
Oczywiście wywali się na 32 bitowym systemie, więc dodaj sprawdzenie architektury i po kłopocie.

Możesz też próbować wyłączać przekierowania przez Wow64DisableWow64FsRedirection ale nie wydaje mi się, żeby to zadziałało.

Azarien
z tego co wyczytałem Wow64DisableWow64FsRedirection psuje frameworka i już nic nie działa :-)
AF
A gdzie o tym czytałeś? Możesz wyłączyć redirection, odpalić osk, przywrócić redirection i liczyć na to, że zadziała. Niemniej po prostu odpalenie 64 bitowego rozwiązuje problem, jedynie przydałoby się zamienić to C:\Windows\Sysnative na jakąś ładną zmienną środowiskową czy propertisa, o ile jest takie coś dostarczone przez API.
Azarien
czytałem na losowych stronach które gógiel wypluł na temat problemu z osk.exe ;-) ponoć właśnie nawet nie da się Process.Start zrobić po wyłączeniu przekierowania. Nie sprawdzałem. Co do C:\Windows\Sysnative to nie wiedziałem o jego istnieniu - to jakiś nowy wynalazek? bo w Win7 tego chyba jeszcze nie było. No i nie należy zakładać na sztywno że to jest c:\windows, nawet jeśli w prawie 100% przypadków będzie.
AF
Sysnative działa od czasu Visty. Oczywiście zgadzam się z C:\Windows, tak jak pisałem, wypadałoby to zastąpić jakąś zmienną systemową lub czymś z API.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)