views:

40

answers:

1

I have been working on a touch screen application. I need to know if there exists a ready touch screen keyboard that I can use as a Controller for my application.

I tried using the windows ready keyboard but it is too small for a touch screen.

Process.Start(Environment.GetFolderPath(Environment.SpecialFolder.System) + Path.DirectorySeparatorChar + "osk.exe");

any ideas how to start building one in minimal time will be greatly appreciated....

New Question

I have copied this code from someone and did some modifications to it :

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


        }



    }
}

This works just fine I have a nice keypad (good size for a touch screen), However, i am not familiar with C# and VB at all.... change the Text in a textbox according to the touch screen keyboard I show.

Thanks,

+1  A: 

To create your own on screen keyboard you basically need to do the following.

1- Create a windows keyboard application that you can interact with but does not steal the input focus from the current control in which every application you where currently working.

2- The keyboard application should send key presses to the currently active control in response to clicking of buttons in the keyboard application.

The following answer I provided previously provides a simple demonstration of how to do this using WinForms.

http://stackoverflow.com/questions/2795558/c-sending-keyboard-events-to-last-selected-window/2796547#2796547

Basically the window is created with the WS_EX_NOACTIVATE style, which prevents the window from becomming active and steeling input focus. Then in response to button clicks it uses SendKeys to send the approriate key press message to the control that has input focus.

The following answer shows how to apply the WS_EX_NOACTIVATE style to a WPF application.

http://stackoverflow.com/questions/2868893/trying-to-create-a-wpf-touch-screen-keyboard-appliaction-cant-get-wpf-app-to-se/2868974#2868974

There are other solutions other than WS_EX_NOACTIVATE, but this is simple and only suffers from a minor presentational glitch when dragging the window arround. Which with some clever message processing can be overcome.

Chris Taylor
Thanks chris, I edited my question with a working code except that I am not sure how I am going to extract the keyboard strikes and make them show in a textbox.thanks
Saher
Never Mind!! I fixed this problem ....I just set the focus on the text box !! Sorry! THANKS
Saher