Win10 Bildschirmtastatur zur Laufzeit aufrufen?

  • VB.NET

Es gibt 36 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Win10 Bildschirmtastatur zur Laufzeit aufrufen?

    Moin zusammen,
    die Bildschirmtastatur von WINDOWS (Win10Pro) ist eigentlich ganz brauchbar.
    Ich habe die mal in die Taskleiste gelegt und von da aufgerufen. Geht so und ist OK.
    Nun habe ich aber ein Programm ohne die Taskleiste.
    Ich würde gerne die Bildschirmtastatur zur Laufzeit aus meinem Programm (z.B. mit einem Button) aufrufen.
    Wie könnte das gehen?

    Grüße Roberto
    Kurzer Check in der Suchmaschine meiner Wahl mit vb.net show screen keyboard und es kommt: System.Diagnostics.Process.Start("osk.exe")
    Klappt bei mir. Manchmal kann die Problemlösung sehr schnell gehen und so einfach sein.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Wobei das bei mir komischerweise nur funktioniert, wenn ich für x64 kompiliere, bei x86 und AnyCpu kriege eine Fehlermeldung, das die Datei nicht gefunden werden kann. Was mich dabei besonders verwirrt ist, das die OSK.exe im System32 ordner ist, nicht in Syswow64.
    Auch wenn ich es nicht probiert habe, hier die Quelle - natürlich stackoverflow. Da steht auch was zu x86/x64.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke, die dort verwendedeten API-Funktionen schau ich mir an. Wobei das FrameWork da verbessert werden müsste, denn die Datei existiert ja, ist also eine falsche Fehlermeldung, der Pfad ist auch korrekt, hab oskPath kopiert und im Explorer in die Adressleiste eingefügt mit Enter bestätigt, OSK ist gestartet.

    VB.NET-Quellcode

    1. '%windir%\system32\osk.exe
    2. Dim oskPath As String = Environment.GetFolderPath(Environment.SpecialFolder.System) & "\osk.exe"
    3. Process.Start(oskPath)

    Takafusa schrieb:

    Daher ist die Fehlermeldung falsch, die das Framework raushaut.
    Korrekt.
    Ich bin mir jetzt nicht sicher, ob das System verhindert, dass von einem x86-Programm aus ein x64-Programm gestartet werden kann und so diese Meldung "entsteht".
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. Declare Function Wow64DisableWow64FsRedirection Lib "kernel32" (ByRef oldvalue As Long) As Boolean
    2. Declare Function Wow64EnableWow64FsRedirection Lib "kernel32" (ByRef oldvalue As Long) As Boolean
    3. Private osk As String = "C:\Windows\System32\osk.exe"
    4. Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
    5. Dim old As Long
    6. If Environment.Is64BitOperatingSystem Then
    7. If Wow64DisableWow64FsRedirection(old) Then
    8. Process.Start(osk)
    9. Wow64EnableWow64FsRedirection(old)
    10. End If
    11. Else
    12. Process.Start(osk)
    13. End If
    14. End Sub

    läuft; Quelle siehe Post#4

    @Takafusa: Wenn ein 32-Bit-Prozess versucht z.B. auf C:\Windows\System32 zuzugreifen, wird es auf ein anderes Verzeichnis (C:\Windows\syswow64) umgeleitet. Mit den WinAPI-Funktionen wird das zeitweise abgeschaltet.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Etwas derartiges ist auch meine Vermutung, hab auch noch was anderes probiert. Hab einfach mal neben der Anwendung eine Batch erstellt, diese mit Process.Start gestartet, gibt auch die Fehlermeldung das die Datei nicht gefunden wurde. Starte ich die Batch von Hand geht es. Da hat MS aber wirklich was verbockt.

    VaporiZed schrieb:

    läuft;


    Wenn ich für x64 kompiliere, da passiert komischerweise garnichts, nicht mal eine Fehlermeldung. x86 and AnyCpu geht.
    Welch Aufwand. :thumbup:
    Langsam bin ich geneigt, allen x86-Code aus meinen Projekten ersatzlos zu streichen, das sind insbesondere x86/x64-DLLs zur Ansteuerung von Hardware.
    Leider würde mir da die Ansteuerung der RaspiCam flöten gehen, die läuft momentan nur unter 32 Bit.
    @Takafusa Kleiner Scherz vom großen Gravitator: ==>

    VB.NET-Quellcode

    1. If Not Environment.Is64BitProcess Then

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VaporiZed schrieb:

    @Takafusa: Wenn ein 32-Bit-Prozess versucht z.B. auf C:\Windows\System32 zuzugreifen, wird es auf ein anderes Verzeichnis (C:\Windows\syswow64) umgeleitet. Mit den WinAPI-Funktionen wird das zeitweise abgeschaltet.


    Das ist ja das verrückte, denn mit dem Code geht es ja bei x64 nicht. x86 und AnyCpu ja, also das gleiche Verhalten nur "andersrum".

    x64 und nur Process.Start geht, x86 AnyCpu nicht.
    mit den Api Funktionen, gehts bei mir nur mit x86 und any CPU
    besser?

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim old As Long
    3. If Environment.Is64BitOperatingSystem AndAlso Wow64DisableWow64FsRedirection(old) Then
    4. Process.Start(osk)
    5. Wow64EnableWow64FsRedirection(old)
    6. Else
    7. Process.Start(osk)
    8. End If
    9. End Sub
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    besser?
    Hat jemand ein 32-Bit Windows bei der Hand?
    Mein letztes (W7-32, VM unter Ubuntu) habe ich grade gegen ein schmuckes W10 getauscht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe eine Win10 Pro-Rechner.
    In den Projekt-Eigenschaften steht:
    Kompilieren (Ziel-CPU) = AnyCPU

    Mit dieser Einstellung kann ich zur Laufzeit die Bildschirmtastatur (wie RFG) nicht aufrufen.
    Eigenartig ist, wenn ich mein Programm gestartet habe, ich
    aber mit der Tastenkombination Win-Taste + Strg + O
    die B-Tastatur ohne Problemme aufrufen kann und diese auch in meinem Programm nutzen kann.
    Hm..
    Würde mir reichen, wenn ich diesen Effekt erreichen könnte mit einem Button_Click.

    Grüße Roberto

    Roberto schrieb:

    Mit dieser Einstellung kann ich zur Laufzeit die Bildschirmtastatur (wie RFG) nicht aufrufen.
    Mit welchem Code?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Probier Post#13
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich habe was gefunden was bei mir mit x86, x64 und AnyCpu geht. Hatte mich schon mit EnvDte usw. rumgeärgert(Aktive COnfiguration hohlen), klappt im neuen Studio irgendwie nicht, gab wohl einige Änderungen? @RodFromGermany brachte mich auf die Idee, mit seinem kleinen Scherz. Mit IntPtr.Size und den API Funktionen kann man das Problem hier lösen.

    VB.NET-Quellcode

    1. Declare Function Wow64DisableWow64FsRedirection Lib "kernel32" (ByRef oldvalue As Long) As Boolean
    2. Declare Function Wow64EnableWow64FsRedirection Lib "kernel32" (ByRef oldvalue As Long) As Boolean
    3. Private Sub StartOSK()
    4. If IntPtr.Size = 8 Then
    5. Process.Start("osk")
    6. ElseIf IntPtr.Size = 4 Then
    7. Dim old As Long
    8. Wow64DisableWow64FsRedirection(old)
    9. Process.Start("osk")
    10. Wow64EnableWow64FsRedirection(old)
    11. Else
    12. MessageBox.Show("Hahahaha, du hast das zauberwort nicht gesagt, hahahaha!")
    13. End If
    14. End Sub

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Takafusa“ ()

    Takafusa schrieb:

    VB.NET-Quellcode

    1. If IntPtr.Size = 8 Then
    ist doch äquivalent zu

    VB.NET-Quellcode

    1. If Environment.Is64BitProcess Then
    Wozu machst Du noch arithmetische Operationen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!