【问题标题】:TabTip click &123 key programmaticallyTabTip 以编程方式单击 &123 键
【发布时间】:2014-08-06 13:33:36
【问题描述】:

我有一个使用 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 的图像,看看我的意思是什么键

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    您可以尝试使用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);
    

    【讨论】:

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

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

    与其破解在不同语言环境等中显示不同的触控输入面板,不如将文本框的InputScope 设置为Number 并让Windows 发挥作用。

    【讨论】:

      猜你喜欢
      • 2021-09-30
      • 1970-01-01
      • 2013-10-09
      • 2011-10-22
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      • 2014-01-08
      • 2017-06-17
      相关资源
      最近更新 更多