c# - TabTip 以编程方式单击 &123 键

标签 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

最佳答案

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

关于c# - TabTip 以编程方式单击 &123 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25161795/

相关文章:

c# - 我应该加载所有数据一次还是一次加载一行 -- MySQL -- C#

c# - C# 中根据用户输入在 DataGridView 的列中进行搜索

c# - Graphics.IsVisible(Rectangle rect) 的文档有误吗?

c# - 数据类型 text 和 varchar 在等于运算符中不兼容

c# - 将元素均匀地添加到列表中

c# - 覆盖 ASP.NET Core 中的 Controller 名称

c# - 如何在不使用存储库模式的情况下对 ASP.NET MVC Controller 进行单元测试

c# - 为什么 Guid 不是 c# 中的对象?

c# - 接受多种类型的方法参数

c# - 如何在窗体加载其控件(或更新它们)时在 Windows 窗体上显示 "loading"覆盖?