Я работаю над приложением для сенсорного экрана. Мне нужно знать, есть ли готовая клавиатура с сенсорным экраном, которую я могу использовать в качестве контроллера для моего приложения.
Я попытался использовать клавиатуру, готовую к окну, но она слишком мала для сенсорного экрана.
Process.Start(Environment.GetFolderPath(Environment.SpecialFolder.System) + Path.DirectorySeparatorChar + "osk.exe");
любые идеи о том, как начать строить один за минимальное время, будут очень благодарны....
Новый вопрос
Я скопировал этот код у кого-то и сделал некоторые изменения:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
class Win32
{
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern bool SetWindowPos(
int hWnd, // window handle
int hWndInsertAfter, // placement-order handle
int X, // horizontal position
int Y, // vertical position
int cx, // width
int cy, // height
uint uFlags); // window positioning flags
public const int HWND_BOTTOM = 0x0001;
public const int HWND_TOP = 0x0000;
public const int SWP_NOSIZE = 0x0001;
public const int SWP_NOMOVE = 0x0002;
public const int SWP_NOZORDER = 0x0004;
public const int SWP_NOREDRAW = 0x0008;
public const int SWP_NOACTIVATE = 0x0010;
public const int SWP_FRAMECHANGED = 0x0020;
public const int SWP_SHOWWINDOW = 0x0040;
public const int SWP_HIDEWINDOW = 0x0080;
public const int SWP_NOCOPYBITS = 0x0100;
public const int SWP_NOOWNERZORDER = 0x0200;
public const int SWP_NOSENDCHANGING = 0x0400;
}
namespace Keyboard
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.KeyText.MouseDoubleClick += new MouseEventHandler(KeyText_MouseDoubleClick);
}
private Process process;
private string getKeyboardText()
{
KeyScreen k = new KeyScreen();
k.ShowDialog();
if (k.DialogResult.ToString().Equals("OK"))
return k.Text1;
else
return null;
}
void KeyText_MouseDoubleClick(object sender, MouseEventArgs e)
{
this.KeyText.Text = getKeyboardText();
}
private void KeyBtn_Click(object sender, EventArgs e)
{
this.showKeypad();
//Process.Start(Environment.GetFolderPath(Environment.SpecialFolder.System) + Path.DirectorySeparatorChar + "osk.exe");
}
private void showKeypad()
{
Process process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.FileName = "c:\\Windows\\system32\\osk.exe";
process.StartInfo.Arguments = "";
process.StartInfo.WorkingDirectory = "c:\\";
process.Start(); // Start Onscreen Keyboard
process.WaitForInputIdle();
Win32.SetWindowPos((int)process.MainWindowHandle,
Win32.HWND_BOTTOM,
300, 300, 1200, 600,
Win32.SWP_SHOWWINDOW | Win32.SWP_NOZORDER);
}
}
}
Это работает отлично, у меня хорошая клавиатура (хороший размер для сенсорного экрана). Однако я не знаком с С# и VB вообще.... измените текст в текстовом поле в соответствии с клавиатурой сенсорного экрана я шоу.
Спасибо,
Чтобы создать свою собственную экранную клавиатуру, вам в основном нужно сделать следующее.
1- Создайте приложение для клавиатуры Windows, с которым вы можете взаимодействовать, но не крадите фокус ввода из текущего элемента управления, в котором каждое приложение, в котором вы сейчас работаете.
2- Приложение клавиатуры должно посылать нажатия клавиш текущему активному элементу управления в ответ на нажатие кнопок в приложении клавиатуры.
Следующий ответ, который я предоставил ранее, дает простое представление о том, как это сделать с помощью WinForms.
С# - отправка событий клавиатуры в (последнее) выбранное окно
В основном окно создается с помощью WS_EX_NOACTIVATE, что предотвращает активное включение окна и фокусировку ввода. Затем в ответ на нажатия кнопки он использует SendKeys, чтобы отправить служебную клавишу с сообщением о нажатии на элемент управления, в котором есть фокус ввода.
Следующий ответ показывает, как применить стиль WS_EX_NOACTIVATE к приложению WPF.
Существуют другие решения, отличные от WS_EX_NOACTIVATE, но это просто и только страдает от незначительного презентационного сбоя при перетаскивании окна arround. Который с некоторой умной обработкой сообщений может быть преодолен.
Я знаю, что это действительно, действительно старо, но на всякий случай, когда кто-то сначала подумал, что встроенная Windows на экранной клавиатуре слишком мала (как и моя первая мысль), на самом деле вы можете просто увеличить ее сделав окно более крупным (что вы также можете делать программно).
+1 для вопроса и размещения кода, хотя, потому что я делаю это просто потому, что мне нужен один с более прямым контролем над ним из моего приложения.