온-스크린 키보드를 표시, 숨기기, 이동 또는 크기 조정하는 방법
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 String) As 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 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", "CKeysFirstForm") 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", "CKeysFirstForm") 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", "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 시스템.Object, ByVal e As 시스템.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 시스템.Object, ByVal e As 시스템.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 시스템.Object, ByVal e As 시스템.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 시스템.Object, ByVal e As 시스템.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 사용자 일반 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); } |
/* * 이 파일은 Jawin을 크게 기반으로 합니다: <a href="http://jawinproject.sourceforge.net/" rel="external">http://jawinproject.sourceforge.net/</a> * * ComfortSoftware keyboard가 로드되었다고 가정합니다... * */
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 = 새로 만들기 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) { 이 항목.stackSize = stackSize; 이 항목.functionName = functionName; 이 항목.parameterDescription = parameterDescription; 이 항목.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의 move 함수에 물리적 픽셀 값을 전달할 수 있으며, 그러면 키보드 창이 정확히 해당 위치로 이동합니다.
이 호환 모드를 프로그래밍 방식으로 활성화하려면(예: 자체 설치 프로그램 사용) 다음 레지스트리 키를 설정해야 합니다.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers:
"C:\Program Files\ComfortKeys\CKeys.exe"="~ HIGHDPIAWARE"
그러면 이 설정이 모든 사용자에게 적용됩니다. 또는 현재 사용자(HKCU)의 레지스트리에 이 키를 배치할 수 있습니다.

