forgive me if this has been discussed recently, but at least I wasn’t able to find such…
What’s the current best practice for onscreen keyboards? I couldn’t find any modules or plugins - does that mean there are none? Or am I overseeing something? All I could find was this: http://nuigroup.com/forums/viewthread/118/#560 - but it looks a bit outdated (and GDI).
i find it very usefull to have a spread of string keys. make a logic with that (getting the slice that is pressed as pure string) and then convert that string to keycode. That keycode you can use in a keyboard state. This way you can use the touch keyboard in almost any situation (like e.g. the HTML texture)or with the typewriter etc.
I didnt really find a vvvv way of converting string to the right keycode, but maybe there is one - so i wrote a quick plugin that does the conversion. Maybe there is one, anyone?
As for the code it is very simple, i only added extra cases for the keys i needed so if you need more you should probably add them, unless there is some better way of converting to keycode?!:
- region usings
using System;
using System.ComponentModel.Composition;
using System.Windows.Forms;
using VVVV.PluginInterfaces.V1;
using VVVV.PluginInterfaces.V2;
using VVVV.Utils.VColor;
using VVVV.Utils.VMath;
using VVVV.Core.Logging;
- endregion usings
namespace VVVV.Nodes
{
#region PluginInfo
[PluginInfo(Name = "StringToKeyCode",
Category = "Windows",
Help = "Converts Chars to KeyCodes",
Tags = "",
AutoEvaluate=false)]
#endregion PluginInfo
public class WindowsStringToKeyCodeNode : IPluginEvaluate
{
#region fields & pins
[Input("Input")](Input("Input"))
public ISpread<string> FInput;
[Output("Key code")](Output("Key code"))
public ISpread<int> FOutput;
[Output("Caps", IsSingle=true)](Output("Caps", IsSingle=true))
public ISpread<bool> FCaps;
[Import()](Import())
public ILogger FLogger;
#endregion fields & pins
[System.Runtime.InteropServices.DllImport("user32.dll")](System.Runtime.InteropServices.DllImport("user32.dll"))
private static extern short VkKeyScan(char ch);
//called when data for any output pin is requested
public void Evaluate(int SpreadMax)
{
FOutput.SliceCount = SpreadMax;
for (int i = 0; i < SpreadMax; i++)
{
if(FInput[i](i) == "")
{
FOutput[i](i) = 0;
return;
}
if(FInput[i](i) == " ")
{
FOutput[i](i) = 32;
return;
}
if(FInput[i](i) == "Bksp")
{
FOutput[i](i) = 8;
return;
}
if(FInput[i](i) == "Shift")
{
FCaps[i](i) = !FCaps[i](i);
return;
}
if(FInput[i](i) == "@")
{
FOutput.SliceCount += 2;
FOutput[i](i) = 17;
FOutput[i+1](i+1) = 18;
FOutput[i+2](i+2) = 81;
return;
}
if(FInput[i](i) == "_")
{
FOutput.SliceCount += 1;
FOutput[i](i) = 16;
FOutput[i+1](i+1) = 189;
return;
}
FOutput[i](i) = VkKeyScan( FInput[i](i)[0](0) );
}
//FLogger.Log(LogType.Debug, "hi tty!");
}
}
}