So zeigen, ausblenden, verschieben und die Größe der Bildschirmtastatur ändern

Sie können Windows-Nachrichten verwenden, um die Bildschirmtastatur zu manipulieren.


So:


WM_CSKEYBOARD = WM_USER + 192;

WM_CSKEYBOARDMOVE = WM_USER + 193;

WM_CSKEYBOARDRESIZE = WM_USER + 197;

 

// um die Tastatur anzuzeigen

PostMessage(FindWindow('TFirstForm', 'CKeyboardFirstForm'), WM_CSKEYBOARD, 1, 0);

 

// Tastatur schließen

PostMessage(FindWindow('TFirstForm', 'CKeyboardFirstForm'), WM_CSKEYBOARD, 2, 0);

 

// zum Ausblenden der Tastatur

PostMessage(FindWindow('TFirstForm', 'CKeyboardFirstForm'), WM_CSKEYBOARD, 3, 0);

 

// Tastatur umschalten (ein-/ausblenden)

PostMessage(FindWindow('TFirstForm', 'CKeyboardFirstForm'), WM_CSKEYBOARD, 4, 0);

 

// Tastatur verschieben (Left, Top – neue Position)

PostMessage(FindWindow('TFirstForm', 'CKeyboardFirstForm'), WM_CSKEYBOARDMOVE, Left, Top);


// Tastaturgröße ändern

PostMessage(FindWindow('TFirstForm', 'CKeyboardFirstForm'), WM_CSKEYBOARDRESIZE, Width, Height);



Private Const WM_CSKEYBOARD = WM_USER + 192

Private Const WM_CSKEYBOARDMOVE = WM_USER + 193

Private Const WM_CSKEYBOARDRESIZE = WM_USER + 197

 

Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As StringAs Long

 

'Code zum Anzeigen der Tastatur

Dim hWnd As Long

hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm")

PostMessage hWnd, WM_CSKEYBOARD, 1, 0

 

'Code zum Schließen der Tastatur

Dim hWnd As Long

hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm")

PostMessage hWnd, WM_CSKEYBOARD, 2, 0

 

'Code zum Verschieben der Tastatur

Dim hWnd As Long

hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm")

PostMessage hWnd, WM_CSKEYBOARDMOVE, 0, 0

 

'Code zum Ändern der Tastaturgröße

Dim hWnd As Long

hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm")

PostMessage hWnd, WM_CSKEYBOARDMOVE, Width, Height


using System;

using System.Windows.Forms;

using System.Runtime.InteropServices;

 

public const Int32 WM_USER = 1024;

public const Int32 WM_CSKEYBOARD = WM_USER + 192;

public const Int32 WM_CSKEYBOARDMOVE = WM_USER + 193;

public const Int32 WM_CSKEYBOARDRESIZE = WM_USER + 197;

 

[DllImport("user32.dll", EntryPoint = "FindWindow")]

private static extern Int32 FindWindow(string _ClassName, string _WindowName);

 

[DllImport("User32.DLL")]

public static extern Boolean PostMessage(Int32 hWnd, Int32 Msg, Int32 wParam, Int32 lParam);

 

 

Int32 hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm");

PostMessage(hWnd, WM_CSKEYBOARD, 1, 0 ); // Anzeigen

PostMessage(hWnd, WM_CSKEYBOARD, 2, 0); // Verstecken

PostMessage(hWnd, WM_CSKEYBOARDMOVE, 0, 0); // Gehe zu 0, 0

PostMessage(hWnd, WM_CSKEYBOARDRESIZE, 600, 300); // Größe auf 600, 300 ändern


Const WM_CSKEYBOARD = &H400 + 192 

Const WM_CSKEYBOARDMOVE = &H400 + 193 

Const WM_CSKEYBOARDRESIZE = &H400 + 197

 

Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As StringAs Integer 

Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As IntegerAs Integer 

 

'Comfort On-Screen Keyboard öffnen/anzeigen 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 

    Dim hWnd As Integer 

    hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm") 

    PostMessage(hWnd, WM_CSKEYBOARD, 1, 0) 

End Sub 

 

'Comfort On-Screen Keyboard schließen 

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 

    Dim hWnd As Integer 

    hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm") 

    PostMessage(hWnd, WM_CSKEYBOARD, 2, 0) 

End Sub 

 

'Verschieben Sie die Comfort On-Screen Keyboard; verschieben Sie sie zuerst und zeigen Sie sie dann an 

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click 

    Dim hWnd As Integer 

    hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm") 

    PostMessage(hWnd, WM_CSKEYBOARDMOVE, 200, 200) 

    PostMessage(hWnd, WM_CSKEYBOARD, 1, 0) 

End Sub 

 

'Comfort On-Screen Keyboard umschalten 

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click 

    Dim hWnd As Integer 

    hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm") 

    PostMessage(hWnd, WM_CSKEYBOARD, 4, 0) 

End Sub 

 

'Comfort On-Screen Keyboard ausblenden 

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click 

    Dim hWnd As Integer 

    hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm") 

    PostMessage(hWnd, WM_CSKEYBOARD, 3, 0) 

End Sub 

 

'Tastaturtyp ändern und anzeigen 

Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click 

    'Registry-Eintrag für die erforderliche Tastatur ändern 

    My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\ComfortSoftware\CKeyboard", "KeyboardName", "Name of your chosen keyboard") 

    'Tastatur öffnen 

    Dim hWnd As Integer 

    hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm") 

    PostMessage(hWnd, WM_CSKEYBOARD, 1, 0) 

End Sub 

 

'Zu einem anderen Tastaturtyp wechseln und anzeigen 

Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click 

    'Registry-Eintrag für die erforderliche Tastatur ändern 

    My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\ComfortSoftware\CKeyboard", "KeyboardName", "Name of another chosen keyboard") 

    'Tastatur öffnen 

    Dim hWnd As Integer 

    hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm") 

    PostMessage(hWnd, WM_CSKEYBOARD, 1, 0) 

End Sub 


using namespace System::Runtime::InteropServices; 

using namespace System::Security::Permissions; 

using namespace Microsoft::Win32; 

 

const System::UInt32 WM_USER = 1024; 

const System::UInt32 WM_CSKEYBOARD = WM_USER + 192; 

const System::UInt32 WM_CSKEYBOARDMOVE = WM_USER + 193;  

 

[DllImport("user32.dll")] 

extern IntPtr FindWindow(String^ lpClassName, String^ lpWindowName); 

[DllImport("user32.dll")] 

extern IntPtr PostMessage(System::IntPtr hWnd, System::UInt32 Msg, int wParam, int lParam); 

[assembly:RegistryPermissionAttribute(SecurityAction::RequestMinimum, All = "HKEY_CURRENT_USER")]; 

 

 

....blah blah blah you normal code...

 

 

void button1_Click(System::Object^  sender, System::EventArgs^  e) 

{ 

    // Comfort On-Screen Keyboard öffnen/anzeigen 

    IntPtr hWnd; 

    hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm"); 

    PostMessage(hWnd, WM_CSKEYBOARD, 1, 0); 

} 

void button2_Click(System::Object^  sender, System::EventArgs^  e) 

{ 

        // Comfort On-Screen Keyboard schließen 

    IntPtr hWnd; 

    hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm"); 

    PostMessage(hWnd, WM_CSKEYBOARD, 2, 0); 

} 

void button3_Click(System::Object^  sender, System::EventArgs^  e) 

{ 

    //Verschieben Sie die Comfort On-Screen Keyboard; verschieben Sie sie zuerst und zeigen Sie sie dann an 

    IntPtr hWnd; 

    hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm"); 

    PostMessage(hWnd, WM_CSKEYBOARDMOVE, 200, 200); 

    PostMessage(hWnd, WM_CSKEYBOARD, 1, 0); 

} 

void button4_Click(System::Object^  sender, System::EventArgs^  e) 

{ 

    //Comfort On-Screen Keyboard umschalten 

    IntPtr hWnd; 

    hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm"); 

    PostMessage(hWnd, WM_CSKEYBOARD, 4, 0); 

} 

void button5_Click(System::Object^  sender, System::EventArgs^  e) 

{ 

    //Comfort On-Screen Keyboard ausblenden 

    IntPtr hWnd; 

    hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm"); 

    PostMessage(hWnd, WM_CSKEYBOARD, 3, 0); 

} 

void button6_Click(System::Object^  sender, System::EventArgs^  e) 

{ 

    //Tastaturtyp ändern und anzeigen 

    System::Object ^kname="NumPad"; 

 

    //Registry-Eintrag für die erforderliche Tastatur ändern 

 

    RegistryKey ^key= Registry::CurrentUser->OpenSubKey ( "Software\\ComfortSoftware\\CKeyboard",true); 

    key->SetValue("KeyboardName",kname); 

 

    //Tastatur öffnen 

    IntPtr hWnd; 

    hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm"); 

    PostMessage(hWnd, WM_CSKEYBOARD, 1, 0); 

}


/* 

 * This file is heavily based on Jawin: <a href="http://jawinproject.sourceforge.net/" rel="external">http://jawinproject.sourceforge.net/</a> 

 * 

 * assumes ComfortSoftware keyboard is loaded... 

 *  

 */ 

 

package client.keyboard; 

 

import java.io.ByteArrayInputStream; 

import java.io.IOException; 

 

import org.jawin.COMException; 

import org.jawin.FuncPtr; 

import org.jawin.ReturnFlags; 

import org.jawin.io.LittleEndianInputStream; 

import org.jawin.io.LittleEndianOutputStream; 

import org.jawin.io.NakedByteStream; 

 

public class ComfortSoftwareKeyboard { 

 

    protected static final String COMFORT_SOFTWARE_WINDOW_NAME = "CKeyboardFirstForm"; 

    protected static final String COMFORT_SOFTWARE_CLASS_NAME = "TFirstForm"; 

     

    protected static final int WM_USER = 1024; 

    protected static final int WM_CSKEYBOARD = WM_USER + 192; 

    protected static final int WM_CSKEYBOARDMOVE = WM_USER + 193; 

 

    protected static final Call FIND_WINDOW = new Call("USER32.DLL", "FindWindowW", "GG:I:", 8); 

    protected static final Call POST_MESSAGE = new Call("USER32.DLL", "PostMessageW", "IIII:I:", 16); 

     

    private static ComfortSoftwareKeyboard INSTANCE = new ComfortSoftwareKeyboard(); 

 

    public static ComfortSoftwareKeyboard getInstance() { 

        return INSTANCE; 

    } 

 

    protected int getWindowHandle() throws COMException, IOException { 

        FuncPtr findWindow = null; 

        findWindow = new FuncPtr(FIND_WINDOW.getDllName(), FIND_WINDOW.getFunctionName()); 

        NakedByteStream bs = new NakedByteStream(); 

        LittleEndianOutputStream leo = new LittleEndianOutputStream(bs); 

        leo.writeStringUnicode(COMFORT_SOFTWARE_CLASS_NAME); 

        leo.writeStringUnicode(COMFORT_SOFTWARE_WINDOW_NAME); 

        byte[] b = findWindow.invoke(FIND_WINDOW.getParameterDescription(), FIND_WINDOW.getStackSize(), bs, null, 

                ReturnFlags.CHECK_FALSE); 

        LittleEndianInputStream leis = new LittleEndianInputStream( 

                new ByteArrayInputStream(b)); 

        int l = leis.readInt(); 

        findWindow.close(); 

        return l; 

    } 

 

    public int move(int x, int y) throws COMException, IOException { 

        int hWnd = getWindowHandle(); 

 

        FuncPtr postMessage = null; 

        postMessage = new FuncPtr(POST_MESSAGE.getDllName(), POST_MESSAGE.getFunctionName()); 

        NakedByteStream bs = new NakedByteStream(); 

        LittleEndianOutputStream leo = new LittleEndianOutputStream(bs); 

 

        leo.writeInt(hWnd); 

        leo.writeInt(WM_CSKEYBOARDMOVE); 

        leo.writeInt(x); 

        leo.writeInt(y); 

 

        byte[] b = postMessage.invoke(POST_MESSAGE.getParameterDescription(), POST_MESSAGE.getStackSize(), bs, null, 

                ReturnFlags.CHECK_FALSE); 

        LittleEndianInputStream leis = new LittleEndianInputStream( 

                new ByteArrayInputStream(b)); 

        int l = leis.readInt(); 

        postMessage.close(); 

        return l; 

    } 

     

    public int setVisible(boolean visible) throws COMException, IOException { 

        int hWnd = getWindowHandle(); 

 

        FuncPtr postMessage = null; 

        postMessage = new FuncPtr(POST_MESSAGE.getDllName(), POST_MESSAGE.getFunctionName()); 

        NakedByteStream bs = new NakedByteStream(); 

        LittleEndianOutputStream leo = new LittleEndianOutputStream(bs); 

 

        leo.writeInt(hWnd); 

        leo.writeInt(WM_CSKEYBOARD); 

        leo.writeInt(visible ? 1 : 2); 

        leo.writeInt(0); 

 

        byte[] b = postMessage.invoke(POST_MESSAGE.getParameterDescription(), POST_MESSAGE.getStackSize(), bs, null, 

                ReturnFlags.CHECK_FALSE); 

        LittleEndianInputStream leis = new LittleEndianInputStream( 

                new ByteArrayInputStream(b)); 

        int l = leis.readInt(); 

        postMessage.close(); 

        return l; 

    } 

 

    public static void main(String[] args) throws Exception { 

        try { 

            ComfortSoftwareKeyboard keyboard = ComfortSoftwareKeyboard.getInstance(); 

            keyboard.setVisible(true); 

            Thread.sleep(1000); 

            keyboard.setVisible(false); 

            Thread.sleep(1000); 

            keyboard.setVisible(true); 

            for (int i = 0; i < 100;i++) { 

                keyboard.move(i, i); 

            } 

        } catch (COMException e) { 

        } finally { 

        } 

    } 

} 

 

class Call { 

    private int stackSize; 

    private String functionName; 

    private String parameterDescription; 

    private String dllName; 

     

    public Call(String dllName, String functionName, String parameterDescription, int stackSize) { 

        this.stackSize = stackSize; 

        this.functionName = functionName; 

        this.parameterDescription = parameterDescription; 

        this.dllName = dllName; 

    } 

    public int getStackSize() {return stackSize;} 

    public String getFunctionName() {return functionName;} 

    public String getParameterDescription() {return parameterDescription;} 

    public String getDllName() {return dllName;} 

}


Wenn Sie Windows-Nachrichten nicht verwenden können, laden Sie diese Dateien herunter und probieren Sie sie aus:

https://www.comfortsoftware.com/download/ShowKB.exe

https://www.comfortsoftware.com/download/HideKB.exe

https://www.comfortsoftware.com/download/ToggleKB.exe

https://www.comfortsoftware.com/download/MoveTopKB.exe

https://www.comfortsoftware.com/download/MoveBottomKB.exe

https://www.comfortsoftware.com/download/MoveLeftKB.exe

https://www.comfortsoftware.com/download/MoveRightKB.exe

https://www.comfortsoftware.com/download/MoveKB.exe (Befehlszeilenformat: MoveKB.exe (links oben)

https://www.comfortsoftware.com/download/SetNameKB.exe (Befehlszeilenformat: SetNameKB.exe KeyboardName)



Wenn Sie Kiosksoftware mit HTML schreiben, können Sie die speziellen JavaScript-Funktionen zur Steuerung der Bildschirmtastatur verwenden.


Mit JavaScript können Sie die Tastatur einblenden, ausblenden oder verschieben. Verwenden Sie einfach die speziellen JavaScript-Funktionen, um tastaturbezogene Informationen zur Browserbeschriftung hinzuzufügen, und die Anwendung überwacht die Beschriftung auf Änderungen.


Laden Sie die Datei mit JavaScript-Funktionen und Beispielen hier herunter: https://www.comfortsoftware.com/commander.html



WM_CSKEYBOARDMOVE: Behebung des Problems beim Verschieben der Tastatur bei Verwendung mehrerer Bildschirme mit unterschiedlicher DPI.


Bildschirm 1 hat beispielsweise eine Auflösung von 2560 x 1440 und ist auf „125 % Skalierung“ eingestellt. in den Windows-Anzeigeeinstellungen. Bildschirm 2 hat eine Auflösung von 1920 x 1080 und ist auf „100 % Skalierung“ eingestellt.


Öffnen Sie die Windows-App-Kompatibilitätseinstellungen der Datei CKeyboard.exe und stellen Sie das DPI-Verhalten auf „Anwendung“ ein, was bedeutet, dass die Anwendung alle DPI-bezogenen Berechnungen verwaltet. Wenn diese Einstellung aktiviert ist, können Sie physische Pixelwerte an die Verschiebefunktion Ihrer API übergeben und das Tastaturfenster wird dann an genau diese Position verschoben.


Wenn Sie diesen Kompatibilitätsmodus programmgesteuert (z. B. mit Ihrem eigenen Installer) aktivieren möchten, müssen Sie den folgenden Registrierungsschlüssel festlegen:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers:

"C:\Program Files\ComfortKeyboard\CKeyboard.exe"="~ HIGHDPIAWARE"


Dies gilt dann für alle Benutzer. Alternativ können Sie diesen Schlüssel in der Registrierung für den aktuellen Benutzer (HKCU) platzieren.