Comment afficher, masquer, déplacer ou redimensionner le clavier à l'écran
Vous pouvez utiliser les messages Windows pour manipuler le clavier à l'écran.
Comme ceci :
WM_CSKEYBOARD = WM_USER + 192;
WM_CSKEYBOARDMOVE = WM_USER + 193;
WM_CSKEYBOARDRESIZE = WM_USER + 197;
// pour afficher le clavier
PostMessage(FindWindow('TFirstForm', 'CKeysFirstForm'), WM_CSKEYBOARD, 1, 0);
// fermer le clavier
PostMessage(FindWindow('TFirstForm', 'CKeysFirstForm'), WM_CSKEYBOARD, 2, 0);
// pour faire disparaître le clavier
PostMessage(FindWindow('TFirstForm', 'CKeysFirstForm'), WM_CSKEYBOARD, 3, 0);
// basculer (afficher/masquer) le clavier
PostMessage(FindWindow('TFirstForm', 'CKeysFirstForm'), WM_CSKEYBOARD, 4, 0);
// déplacer le clavier (Left, Top - nouvelle position)
PostMessage(FindWindow('TFirstForm', 'CKeysFirstForm'), WM_CSKEYBOARDMOVE, Left, Top);
// redimensionner le clavier
PostMessage(FindWindow('TFirstForm', 'CKeysFirstForm'), 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 String) As Long
'Code pour afficher le clavier Dim hWnd As Long hWnd = FindWindow("TFirstForm", "CKeysFirstForm") PostMessage hWnd, WM_CSKEYBOARD, 1, 0
'Code pour fermer le clavier Dim hWnd As Long hWnd = FindWindow("TFirstForm", "CKeysFirstForm") PostMessage hWnd, WM_CSKEYBOARD, 2, 0
'Code pour déplacer le clavier Dim hWnd As Long hWnd = FindWindow("TFirstForm", "CKeysFirstForm") PostMessage hWnd, WM_CSKEYBOARDMOVE, 0, 0
'Code pour redimensionner le clavier Dim hWnd As Long hWnd = FindWindow("TFirstForm", "CKeysFirstForm") 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", "CKeysFirstForm"); PostMessage(hWnd, WM_CSKEYBOARD, 1, 0 ); // Afficher PostMessage(hWnd, WM_CSKEYBOARD, 2, 0); // Masquer PostMessage(hWnd, WM_CSKEYBOARDMOVE, 0, 0); // Déplacer vers 0, 0 PostMessage(hWnd, WM_CSKEYBOARDRESIZE, 600, 300); // Redimensionner à 600, 300 |
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 String) As Integer Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
'Ouvrir/afficher Comfort On-Screen Keyboard Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim hWnd As Integer hWnd = FindWindow("TFirstForm", "CKeysFirstForm") PostMessage(hWnd, WM_CSKEYBOARD, 1, 0) End Sub
'Fermer Comfort On-Screen Keyboard Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim hWnd As Integer hWnd = FindWindow("TFirstForm", "CKeysFirstForm") PostMessage(hWnd, WM_CSKEYBOARD, 2, 0) End Sub
'Déplacer Comfort On-Screen Keyboard ; le déplacer d'abord puis l'afficher Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Dim hWnd As Integer hWnd = FindWindow("TFirstForm", "CKeysFirstForm") PostMessage(hWnd, WM_CSKEYBOARDMOVE, 200, 200) PostMessage(hWnd, WM_CSKEYBOARD, 1, 0) End Sub
'Basculer Comfort On-Screen Keyboard Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click Dim hWnd As Integer hWnd = FindWindow("TFirstForm", "CKeysFirstForm") PostMessage(hWnd, WM_CSKEYBOARD, 4, 0) End Sub
'Faire disparaître Comfort On-Screen Keyboard Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click Dim hWnd As Integer hWnd = FindWindow("TFirstForm", "CKeysFirstForm") PostMessage(hWnd, WM_CSKEYBOARD, 3, 0) End Sub
'Modifier le type de clavier et l'afficher Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click 'Modifier l'entrée du Registre pour le clavier requis My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\ComfortSoftware\CKeys", "KeyboardName", "Name of your chosen keyboard") 'Ouvrir le clavier Dim hWnd As Integer hWnd = FindWindow("TFirstForm", "CKeysFirstForm") PostMessage(hWnd, WM_CSKEYBOARD, 1, 0) End Sub
'Passer à un autre type de clavier et l'afficher Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click 'Modifier l'entrée du Registre pour le clavier requis My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\ComfortSoftware\CKeys", "KeyboardName", "Name of another chosen keyboard") 'Ouvrir le clavier Dim hWnd As Integer hWnd = FindWindow("TFirstForm", "CKeysFirstForm") 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) { // Ouvrir/afficher Comfort On-Screen Keyboard IntPtr hWnd; hWnd = FindWindow("TFirstForm", "CKeysFirstForm"); PostMessage(hWnd, WM_CSKEYBOARD, 1, 0); } void button2_Click(System::Object^ sender, System::EventArgs^ e) { // Fermer Comfort On-Screen Keyboard IntPtr hWnd; hWnd = FindWindow("TFirstForm", "CKeysFirstForm"); PostMessage(hWnd, WM_CSKEYBOARD, 2, 0); } void button3_Click(System::Object^ sender, System::EventArgs^ e) { //Déplacer Comfort On-Screen Keyboard ; le déplacer d'abord puis l'afficher IntPtr hWnd; hWnd = FindWindow("TFirstForm", "CKeysFirstForm"); PostMessage(hWnd, WM_CSKEYBOARDMOVE, 200, 200); PostMessage(hWnd, WM_CSKEYBOARD, 1, 0); } void button4_Click(System::Object^ sender, System::EventArgs^ e) { //Basculer Comfort On-Screen Keyboard IntPtr hWnd; hWnd = FindWindow("TFirstForm", "CKeysFirstForm"); PostMessage(hWnd, WM_CSKEYBOARD, 4, 0); } void button5_Click(System::Object^ sender, System::EventArgs^ e) { //Faire disparaître Comfort On-Screen Keyboard IntPtr hWnd; hWnd = FindWindow("TFirstForm", "CKeysFirstForm"); PostMessage(hWnd, WM_CSKEYBOARD, 3, 0); } void button6_Click(System::Object^ sender, System::EventArgs^ e) { //Modifier le type de clavier et l'afficher System::Object ^kname="NumPad";
//Modifier l'entrée du Registre pour le clavier requis
RegistryKey ^key= Registry::CurrentUser->OpenSubKey ( "Software\\ComfortSoftware\\CKeys",true); key->SetValue("KeyboardName",kname);
//Ouvrir le clavier IntPtr hWnd; hWnd = FindWindow("TFirstForm", "CKeysFirstForm"); 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 = "CKeysFirstForm"; 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;} } |
Si vous ne parvenez pas à utiliser Windows Messages, téléchargez et essayez ces fichiers :
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 (Format de ligne de commande : MoveKB.exe en haut à gauche)
https://www.comfortsoftware.com/download/SetNameKB.exe (Format de ligne de commande : SetNameKB.exe KeyboardName)
Si vous écrivez un logiciel de kiosque en HTML, vous pouvez utiliser les fonctions JavaScript spéciales pour contrôler le clavier à l'écran.
Avec JavaScript, vous pouvez afficher, masquer ou déplacer le clavier. Utilisez simplement les fonctions JavaScript spéciales pour ajouter des informations relatives au clavier à la légende du navigateur, et l'application surveillera la légende pour détecter les modifications.
Téléchargez le fichier avec les fonctions JavaScript et les exemples à partir d'ici : https://www.comfortsoftware.com/commander.html
WM_CSKEYBOARDMOVE : résolution du problème de déplacement du clavier lors de l'utilisation de plusieurs écrans avec des DPI différents.
Par exemple, l'écran 1 a une résolution de 2 560 x 1 440 et est réglé sur une « échelle de 125 % ». dans les paramètres d'affichage de Windows. L'écran 2 mesure 1 920 x 1 080 et est réglé sur « échelle 100 %.
Ouvrez les paramètres de compatibilité de l'application Windows 10 du fichier CKeys.exe et définissez le comportement DPI sur « Application », ce qui signifie que l'application gère tous les calculs liés au DPI. Avec ce paramètre activé, vous pouvez transmettre les valeurs de pixels physiques à la fonction de déplacement de votre API, et la fenêtre du clavier est ensuite déplacée exactement vers cette position.
Si vous souhaitez activer ce mode de compatibilité par programme (par exemple avec votre propre programme d'installation), vous devez définir la clé de registre suivante :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers:
"C:\Program Files\ComfortKeys\CKeys.exe"="~ HIGHDPIAWARE"
Cela s’appliquera alors à tous les utilisateurs. Vous pouvez également placer cette clé dans le registre de l'utilisateur actuel (HKCU).

