2010-07-03 4 views
2

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

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

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

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

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

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

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

C# - Sending keyboard events to (last) selected window

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

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

Trying to create a WPF Touch Screen Keyboard Appliaction, Can't get WPF App to Send Keys to another window? Any suggestions?

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

+0

Спасибо, chris, я отредактировал свой вопрос с рабочим кодом, за исключением того, что я не уверен, как я собираюсь извлечь удары клавиатуры и сделать их показанными в текстовом поле. спасибо –

+0

Never Mind !! Я исправил эту проблему ... Я просто сосредоточил внимание на текстовом поле !! Сожалею! THANKS –

1

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

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

+0

Я дам вам +1 за ответ. Я не вижу свой +1 для вопроса, хотя :( –

+0

Ха-ха, я случайно ушел, прежде чем я это сделал. Там вы идете ... теперь всего лишь 3 от 2000 :) – BVernon