Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 选项卡提示单击&;123键编程_C#_Winforms - Fatal编程技术网

C# 选项卡提示单击&;123键编程

C# 选项卡提示单击&;123键编程,c#,winforms,C#,Winforms,我有一个利用Windows8键盘的C#winForms应用程序 我通过启动tabtip.exe打开键盘 我可以使用如下PostMessage命令关闭键盘: public static void HideOnScreenKeyboard() { uint WM_SYSCOMMAND = 274; uint SC_CLOSE = 61536; IntPtr KeyboardWnd = FindWindow("IPTip_Main_Window", null); Pos

我有一个利用Windows8键盘的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++,但是有太多的消息不断传递,我不知道该去哪里看

看看屏幕上的图像,看看我指的是什么键

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

下面是一个如何使用SendInput将鼠标单击(左下+左上)发送到按钮的示例,但我没有包含通过编程查找窗口和获取窗口大小的代码

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

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


不要对触摸输入面板进行黑客攻击,因为触摸输入面板在不同的地区显示不同,等等。将文本框的
InputScope
设置为
Number
,让Windows发挥神奇的作用。

嗨,Miky,我认为这不是我问题的答案。在Windows 8上,当您运行TabTip.exe时,屏幕上会弹出一个键盘。这有一个我想按的&123键。我在我的原始问题中添加了一个图像,以使问题更清楚。你说得对。。我似乎误解了你的问题,不如用鼠标事件来代替。您可以使用SendInput模拟鼠标单击,并根据TabTip窗口的位置以编程方式确定&123键的坐标。这确实有效,但并不是真正想要的效果。现在键盘弹出字母数字,然后我模拟鼠标按键,然后键盘切换到数字。因此,用户可以看到交换。不太理想。但这和我想解决的问题是一样的,所以你的答案是正确的。我将从我的应用程序中删除它,因此如果需要,用户必须手动切换到数字键盘。