TabTip以编程方式单击& 123键

时间:2014-08-06 13:33:36

标签: c# winforms

我有一个使用Windows 8键盘的C#winForms应用程序。

我通过启动tabtip.exe来打开键盘。

我可以使用PostMessage命令关闭键盘,如下所示:

public static void HideOnScreenKeyboard()
{
    uint WM_SYSCOMMAND = 274;
    uint SC_CLOSE = 61536;
    IntPtr KeyboardWnd = FindWindow("IPTip_Main_Window", null);
    PostMessage(KeyboardWnd.ToInt32(), WM_SYSCOMMAND, (int)SC_CLOSE, 0);
}

我认为如果只传递正确的值,使用PostMessage应该可以以编程方式模拟几乎所有内容。

用于关闭我刚刚在互联网上找到的键盘(274和61536)的值。

看起来可以使用Spy ++或其他一些工具来获取这些值,但我无法如何做到这一点。

有人能告诉我在& 123键上模拟按下所需的值,键盘会切换到数字键盘吗?

或者,有人知道如何获得这些价值吗?

我已经尝试过Spy ++,但是有很多信息不断传递,我不知道该去哪里看。

查看OnScreenKeyboard的图像以查看我的意思

Tabtip keyboard &123

2 个答案:

答案 0 :(得分:3)

您可以尝试使用SendInput在虚拟键盘窗口的& 123按钮上模拟鼠标点击事件。

下面是一个如何使用SendInput向按钮发送鼠标单击(left_down + left_up)的示例,但我还没有包含代码以编程方式找到窗口并获取窗口大小。

[StructLayout(LayoutKind.Sequential)]
public struct MINPUT
{
  internal uint type;
  internal short dx;
  internal short dy;
  internal ushort mouseData;
  internal ushort dwFlags;
  internal ushort time;
  internal IntPtr dwExtraInfo;
  internal static int Size
  {
     get { return Marshal.SizeOf(typeof(INPUT)); }
  }
}      

const ushort MOUSEEVENTF_ABSOLUTE = 0x8000;
const ushort MOUSEEVENTF_LEFTDOWN = 0x0002;
const ushort MOUSEEVENTF_LEFTUP = 0x0004;

// programatically determine the position and size of the TabTip window
// compute the location of the center of the &123 key
int coordinateX = ...
int coordinateY = ...

var pInputs = new[] { 
                new MINPUT() {
                     type = 0×01; //INPUT_KEYBOARD                         
                     dx = coordinateX,
                     dy = coordinateY;
                     dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN;
                     time = 0;
                     dwExtraInfo = IntPtr.Zero;
                },
                new MINPUT() {
                     type = 0×01; //INPUT_KEYBOARD
                     dx = coordinateX,
                     dy = coordinateY;
                     dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP;
                     time = 0;
                     dwExtraInfo = IntPtr.Zero;
               }
};

SendInput((uint)pInputs.Length, pInputs, MINPUT.Size);

答案 1 :(得分:0)

为什么不将编辑控件的输入范围设置为数字?具有正确属性的新内置编辑控件会在触摸时自动触发数字模式。