オンライン ヘルプ

Comfort Keys Pro の紹介
Comfort Keys Pro の購入方法
Comfort Keys Pro の使用方法
キーボードショートカットの設定
テンプレートマネージャの操作
クリップボードマネージャの操作
スクリーンキーボードの使用
入力言語の制御
キーボードタイプのカスタマイズ
テンプレートの編集中
テキストタグ
ショートカットアイコンの編集中
アクションの種類
プログラムを実行し、ドキュメントまたはフォルダーを開く
1つまたは複数のインターネットリソースを開く
テキストの貼り付け
キーストロークマクロを再生する
ネットワークの接続/切断
Comfort Keys Pro のアクション
オーディオ制御
モニター制御
ウィンドウ制御
システムアクションを実行する
言語または文字種を変更する
ロック/再起動/シャットダウン
ブロックキーまたはショートカット
キーまたはショートカットの置き換え
設定
システム
表示テーマ
キーボード ショートカット
スクリーンキーボード
表示/非表示
表示位置
キー
ジェスチャー
拡大
入力支援
フローティングウィンドウ
クリップボードマネージャ
テンプレートマネージャ
入力候補
言語切り替え
言語バー
ショートカット アイコン
タスク切り替えウィンドウ
プロセス履歴ウィンドウ
サウンド
依存関係
セキュリティ
詳細設定
開発
スクリーンキーボードを表示、非表示、移動、またはサイズ変更する方法
すべての設定をロックする方法
別のキーボードを有効にする方法
開発者向けFAQ
コマンドラインパラメータ
その他の問題
FAQ - よくある質問

スクリーンキーボードを表示、非表示、移動、またはサイズ変更する方法

Windows Messages を使用してスクリーンキーボードを操作できます。


次のように:


WM_CSKEYBOARD = WM_USER + 192;

WM_CSKEYBOARDMOVE = WM_USER + 193;

WM_CSKEYBOARDRESIZE = WM_USER + 197;

 

// キーボードを表示する

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

 

// キーボードを閉じる

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

 

// キーボードをフェードする

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

 

// キーボードの表示/非表示を切り替える

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

 

// キーボードを移動する(Left, Top - 新しい位置)

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


// キーボードのサイズを変更する

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 StringAs Long

 

'キーボードを表示するコード

Dim hWnd As Long

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

PostMessage hWnd, WM_CSKEYBOARD, 1, 0

 

'キーボードを閉じるコード

Dim hWnd As Long

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

PostMessage hWnd, WM_CSKEYBOARD, 2, 0

 

'キーボードを移動するコード

Dim hWnd As Long

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

PostMessage hWnd, WM_CSKEYBOARDMOVE, 0, 0

 

'キーボードのサイズを変更するコード

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 ); // 表示

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 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 を開く/表示する 

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 

 

'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 

 

'Comfort On-Screen Keyboard を移動する;先に移動してから表示する 

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 

 

'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 

 

'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 

 

'キーボードタイプを変更して表示する 

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

    '必要なキーボードの Registry エントリを変更する 

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

    'キーボードを開く 

    Dim hWnd As Integer 

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

    PostMessage(hWnd, WM_CSKEYBOARD, 1, 0) 

End Sub 

 

'別のキーボードタイプに変更して表示する 

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

    '必要なキーボードの Registry エントリを変更する 

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

    'キーボードを開く 

    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) 

{ 

    // 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) 

{ 

        // 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) 

{ 

    //Comfort On-Screen Keyboard を移動する;先に移動してから表示する 

    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) 

{ 

    //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) 

{ 

    //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) 

{ 

    //キーボードタイプを変更して表示する 

    System::Object ^kname="NumPad"; 

 

    //必要なキーボードの Registry エントリを変更する 

 

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

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

 

    //キーボードを開く 

    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;} 

}


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% スケール" に設定されています。


CKeys.exe ファイルの Windows 10 アプリ互換性設定を開き、DPI 動作を "Application" に設定します。これは、DPI に関連するすべての計算をアプリケーションが管理することを意味します。この設定を有効にすると、API の移動関数に物理ピクセル値を渡すことができ、キーボードウィンドウはその正確な位置に移動します。


この互換モードをプログラムから有効にしたい場合(たとえば独自のインストーラーから)、次のレジストリキーを設定する必要があります:

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

"C:\Program Files\ComfortKeys\CKeys.exe"="~ HIGHDPIAWARE"


これにより、すべてのユーザーに適用されます。別の方法として、このキーを現在のユーザーのレジストリ(HKCU)に配置することもできます。