Aplikacja desktop (WinForms) - klawiatura ekranowa

Aplikacja desktop (WinForms) - klawiatura ekranowa
AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:42 minuty
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2161
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:około godziny
  • Postów:1494
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:około 2 miesiące
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:42 minuty
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2161
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:około 2 miesiące
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:42 minuty
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2161
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:42 minuty
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2161
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:około godziny
  • Postów:1494
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:42 minuty
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2161
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:około godziny
  • Postów:1494
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:42 minuty
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2161
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:około 2 miesiące
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.