Aplikacja desktop (WinForms) - klawiatura ekranowa

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.

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.

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.

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.

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.

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

0

Windows 10 Any CPU Debug, to samo w Release

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

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

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?

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?

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?

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.

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

gdzie runosk.exe robi coś takiego:

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.

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