Клавиатура с сенсорным экраном - PullRequest
2 голосов
/ 03 июля 2010

Я работал над приложением с сенсорным экраном.Мне нужно знать, существует ли готовая клавиатура с сенсорным экраном, которую я могу использовать в качестве контроллера для своего приложения.

Я пытался использовать клавиатуру Windows Ready, но она слишком мала для сенсорного экрана.

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


        }



    }
}

Это работает очень хорошо, у меня есть хорошая клавиатура (хороший размер для сенсорного экрана), однако, я совсем не знаком с C # и VB ....измените текст в текстовом поле в соответствии с клавиатурой сенсорного экрана, которую я показываю.

Спасибо,

Ответы [ 2 ]

2 голосов
/ 03 июля 2010

Чтобы создать собственную экранную клавиатуру, вам нужно выполнить следующее.

1- Создайте приложение клавиатуры Windows, с которым вы можете взаимодействовать, но не крадете фокус ввода из текущего элемента управления, в котором каждое приложение, где вы в данный момент работаете.

2- Приложение клавиатуры должно отправлять нажатия клавиш на активный в данный момент элемент управления в ответ на нажатие кнопок в приложении клавиатуры.

Следующий ответ, который я предоставил ранее, представляет собой простую демонстрацию того, как сделать это с помощью WinForms.

C # - Отправка событий клавиатуры в (последнее) выбранное окно

По сути, окно создается в стиле WS_EX_NOACTIVATE , который не позволяет окну становиться активным и стальным фокусом ввода. Затем в ответ на нажатие кнопки он использует SendKeys для отправки сообщения о нажатии клавиши для элемента управления, который имеет фокус ввода.

Следующий ответ показывает, как применить стиль WS_EX_NOACTIVATE к приложению WPF.

Попытка создать приложение клавиатуры с сенсорным экраном WPF. Не удается получить приложение WPF для отправки ключей в другое окно? Есть предложения?

Существуют и другие решения, кроме WS_EX_NOACTIVATE, но это просто и страдает только незначительным сбоем представления при перетаскивании окна. Который с некоторой умной обработкой сообщения может быть преодолен.

1 голос
/ 28 января 2014

Я знаю, что это действительно очень старый, но на случай, если кто-то еще подумал, что встроенная в экранную клавиатуру Windows слишком мала (как это было и в моей первой мысли), вы можете увеличить ее, просто сделав окно больше, (вы также можете сделать это программно).

+ 1 за вопрос и размещение кода, хотя, потому что я делаю его просто потому, что мне нужен более прямой контроль над ним из моего приложения.

...