スクリーンキーボードを表示、非表示、移動、またはサイズ変更する方法
Windows Messages を使用してスクリーンキーボードを操作できます。
次のように:
WM_CSKEYBOARD = WM_USER + 192;
WM_CSKEYBOARDMOVE = WM_USER + 193;
WM_CSKEYBOARDRESIZE = WM_USER + 197;
// キーボードを表示する
PostMessage(FindWindow('TFirstForm', 'CKeyboardFirstForm'), WM_CSKEYBOARD, 1, 0);
// キーボードを閉じる
PostMessage(FindWindow('TFirstForm', 'CKeyboardFirstForm'), WM_CSKEYBOARD, 2, 0);
// キーボードをフェードする
PostMessage(FindWindow('TFirstForm', 'CKeyboardFirstForm'), WM_CSKEYBOARD, 3, 0);
// キーボードの表示/非表示を切り替える
PostMessage(FindWindow('TFirstForm', 'CKeyboardFirstForm'), WM_CSKEYBOARD, 4, 0);
// キーボードを移動する(Left, Top - 新しい位置)
PostMessage(FindWindow('TFirstForm', 'CKeyboardFirstForm'), WM_CSKEYBOARDMOVE, Left, Top);
// キーボードのサイズを変更する
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 String) As Long
'キーボードを表示するコード Dim hWnd As Long hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm") PostMessage hWnd, WM_CSKEYBOARD, 1, 0
'キーボードを閉じるコード Dim hWnd As Long hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm") PostMessage hWnd, WM_CSKEYBOARD, 2, 0
'キーボードを移動するコード Dim hWnd As Long hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm") PostMessage hWnd, WM_CSKEYBOARDMOVE, 0, 0
'キーボードのサイズを変更するコード 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 ); // 表示 PostMessage(hWnd, WM_CSKEYBOARD, 2, 0); // 非表示 PostMessage(hWnd, WM_CSKEYBOARDMOVE, 0, 0); // 0, 0 に移動 PostMessage(hWnd, WM_CSKEYBOARDRESIZE, 600, 300); // 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
'Comfort On-Screen Keyboard を開く/表示する Private Sub Button1_Click(ByVal sender As システム.Object, ByVal e As システム.EventArgs) Handles Button1.Click Dim hWnd As Integer hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm") PostMessage(hWnd, WM_CSKEYBOARD, 1, 0) End Sub
'Comfort On-Screen Keyboard を閉じる Private Sub Button2_Click(ByVal sender As システム.Object, ByVal e As システム.EventArgs) Handles Button2.Click Dim hWnd As Integer hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm") PostMessage(hWnd, WM_CSKEYBOARD, 2, 0) End Sub
'Comfort On-Screen Keyboard を移動する;先に移動してから表示する Private Sub Button3_Click(ByVal sender As システム.Object, ByVal e As システム.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 を切り替える Private Sub Button4_Click(ByVal sender As システム.Object, ByVal e As システム.EventArgs) Handles Button4.Click Dim hWnd As Integer hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm") PostMessage(hWnd, WM_CSKEYBOARD, 4, 0) End Sub
'Comfort On-Screen Keyboard をフェードする Private Sub Button5_Click(ByVal sender As システム.Object, ByVal e As システム.EventArgs) Handles Button5.Click Dim hWnd As Integer hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm") PostMessage(hWnd, WM_CSKEYBOARD, 3, 0) End Sub
'キーボードタイプを変更して表示する Private Sub Button6_Click(ByVal sender As システム.Object, ByVal e As システム.EventArgs) Handles Button6.Click '必要なキーボードの Registry エントリを変更する My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\ComfortSoftware\CKeyboard", "KeyboardName", "Name of your chosen keyboard") 'キーボードを開く Dim hWnd As Integer hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm") PostMessage(hWnd, WM_CSKEYBOARD, 1, 0) End Sub
'別のキーボードタイプに変更して表示する Private Sub Button7_Click(ByVal sender As システム.Object, ByVal e As システム.EventArgs) Handles Button7.Click '必要なキーボードの Registry エントリを変更する My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\ComfortSoftware\CKeyboard", "KeyboardName", "Name of another chosen keyboard") 'キーボードを開く 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 ユーザー 標準 code...
void button1_Click(System::Object^ sender, System::EventArgs^ e) { // Comfort On-Screen Keyboard を開く/表示する 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 を閉じる IntPtr hWnd; hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm"); PostMessage(hWnd, WM_CSKEYBOARD, 2, 0); } void button3_Click(System::Object^ sender, System::EventArgs^ e) { //Comfort On-Screen Keyboard を移動する;先に移動してから表示する 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 を切り替える 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 をフェードする IntPtr hWnd; hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm"); PostMessage(hWnd, WM_CSKEYBOARD, 3, 0); } void button6_Click(System::Object^ sender, System::EventArgs^ e) { //キーボードタイプを変更して表示する System::Object ^kname="NumPad";
//必要なキーボードの Registry エントリを変更する
RegistryKey ^key= Registry::CurrentUser->OpenSubKey ( "Software\\ComfortSoftware\\CKeyboard",true); key->SetValue("KeyboardName",kname);
//キーボードを開く IntPtr hWnd; hWnd = FindWindow("TFirstForm", "CKeyboardFirstForm"); PostMessage(hWnd, WM_CSKEYBOARD, 1, 0); } |
/* * このファイルは Jawin を大きく基にしています: <a href="http://jawinproject.sourceforge.net/" rel="external">http://jawinproject.sourceforge.net/</a> * * ComfortSoftware キーボードが読み込まれていることを前提としています... * */
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 = 新規 Call("USER32.DLL", "FindWindowW", "GG:I:", 8); protected static final Call POST_MESSAGE = 新規 Call("USER32.DLL", "PostMessageW", "IIII:I:", 16);
private static ComfortSoftwareKeyboard INSTANCE = 新規 ComfortSoftwareKeyboard();
public static ComfortSoftwareKeyboard getInstance() { return INSTANCE; }
protected int getWindowHandle() throws COMException, IOException { FuncPtr findWindow = null; findWindow = 新規 FuncPtr(FIND_WINDOW.getDllName(), FIND_WINDOW.getFunctionName()); NakedByteStream bs = 新規 NakedByteStream(); LittleEndianOutputStream leo = 新規 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 = 新規 LittleEndianInputStream( 新規 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 = 新規 FuncPtr(POST_MESSAGE.getDllName(), POST_MESSAGE.getFunctionName()); NakedByteStream bs = 新規 NakedByteStream(); LittleEndianOutputStream leo = 新規 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 = 新規 LittleEndianInputStream( 新規 ByteArrayInputStream(b)); int l = leis.readInt(); postMessage.close(); return l; }
public int setVisible(boolean 表示) throws COMException, IOException { int hWnd = getWindowHandle();
FuncPtr postMessage = null; postMessage = 新規 FuncPtr(POST_MESSAGE.getDllName(), POST_MESSAGE.getFunctionName()); NakedByteStream bs = 新規 NakedByteStream(); LittleEndianOutputStream leo = 新規 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 = 新規 LittleEndianInputStream( 新規 ByteArrayInputStream(b)); int l = leis.readInt(); postMessage.close(); return l; }
public static void main(String[] args) throws Exception { try { ComfortSoftwareKeyboard キーボード = 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;} } |
Windows Messages を使用できない場合は、次のファイルをダウンロードして試してください:
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 (コマンドライン形式: MoveKB.exe Left Top)
https://www.comfortsoftware.com/download/SetNameKB.exe (コマンドライン形式: SetNameKB.exe KeyboardName)
HTML を使用してキオスクソフトウェアを作成している場合、特別な JavaScript 関数を使用してスクリーンキーボードを制御できます。
JavaScript を使用すると、キーボードを表示、非表示、または移動できます。専用の JavaScript 関数を使用して、キーボード関連の情報をブラウザのキャプションに追加するだけで、アプリケーションがキャプションの変更を監視します。
JavaScript 関数と例を含むファイルをここからダウンロードしてください: https://www.comfortsoftware.com/commander.html
WM_CSKEYBOARDMOVE: DPI の異なる複数の画面を使用している場合に、キーボードの移動に関する問題を解決します。
たとえば、画面 1 の解像度は 2560x1440 で、Windows のディスプレイ設定では "125% スケール" に設定されています。画面 2 は 1920x1080 で、"100% スケール" に設定されています。
CKeyboard.exe ファイルの Windows アプリ互換性設定を開き、DPI 動作を "Application" に設定します。これは、DPI に関連するすべての計算をアプリケーションが管理することを意味します。この設定を有効にすると、API の移動関数に物理ピクセル値を渡すことができ、キーボードウィンドウはその正確な位置に移動します。
この互換モードをプログラムから有効にしたい場合(たとえば独自のインストーラーから)、次のレジストリキーを設定する必要があります:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers:
"C:\Program Files\ComfortKeyboard\CKeyboard.exe"="~ HIGHDPIAWARE"
これにより、すべてのユーザーに適用されます。別の方法として、このキーを現在のユーザーのレジストリ(HKCU)に配置することもできます。

