当前位置: 首页 > 知识库问答 >
问题:

TabTip键盘的设置位置C#不起作用

胥诚
2023-03-14
    [DllImport("user32.dll")]
    static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X,
    int Y, int cx, int cy, uint uFlags);

    [DllImport("user32.dll")]
    static extern bool SetForegroundWindow(IntPtr hWnd);
    [DllImport("user32.dll")]
    static extern IntPtr FindWindow(string ClassName, string WindowName);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
        public int Left;        // x position of upper-left corner
        public int Top;         // y position of upper-left corner
        public int Right;       // x position of lower-right corner
        public int Bottom;      // y position of lower-right corner
    }

    Rectangle KeyboardRect;
    IntPtr TabTipHandle;

   IntPtr GetWindowHandle()
    {
        return FindWindow("IPTip_Main_Window",null);
    }

   bool MoveKeyBoard(IntPtr hWnd, int ToX, int ToY)
    {
       return SetWindowPos(hWnd, this.Handle, ToX, ToY, KeyboardRect.Width, KeyaboardRect.Height, 0x0045);
    }
    void StartKeyboard()
    {
        Process.Start(@"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe");
        TabTipHandle = GetWindowHandle();
        KeyboardRect = GetKeyboardRect(TabTipHandle);
        textBox1.Text = KeyaboardRect.Top.ToString() + ", " + KeyboardRect .Left.ToString()      + ", " + KeyboardRect .Width.ToString() + ", " + KeyboardRect .Height.ToString();

        MoveKeyBoard(TabTipHandle, 100, 100);
        KeyboardRect = GetKeyboardRect(TabTipHandle);
        textBox2.Text = KeyaboardRect.Top.ToString() + ", " + KeyboardRect .Left.ToString()      + ", " + KeyboardRect .Width.ToString() + ", " + KeyboardRect .Height.ToString();
     }
    void button1_Click(object sender, EventArgs e)
    {
      StartKeyboard();
    }
    void button2_Click(object sender, EventArgs e)
    {
        MoveKeyBoard(TabTipHandle, 200, 100);
        KeyboardRect = GetKeyboardRect(TabTipHandle);
        textBox2.Text = KeyboardRect .Top.ToString() + ", " + KeyboardRect .Left.ToString()      + ", " + KeyboardRect .Width.ToString() + ", " + KeyboardRect .Height.ToString();

    }

`

共有1个答案

许黎明
2023-03-14

如果您在创建流程后添加一个小延迟,它就会工作,如下所示:

 Process.Start(@"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe");
 await Task.Delay(150); // Just a tiny delay before continuing
 ...
 MoveKeyBoard(TabTipHandle, 100, 100);
 ...

然而,现在我面临一个奇怪的问题,即使用setWindowpos时,键盘不能准确地定位在我希望的位置。窗口似乎在点附近摆动,直到在多次调用setWindowpos后保持固定。很奇怪,如果你问我的话。由于没有任何文档,我搜索了注册表,因为我注意到Tabtip.exe将在关闭时的完全相同的位置启动。所以我找到了这两个DWORD注册表值:

HKCU\SOFTWARE\Microsoft\TabletTip\1.7\OptimizedKeyboardRelativeXPositionOnScreen
HKCU\SOFTWARE\Microsoft\TabletTip\1.7\OptimizedKeyboardRelativeYPositionOnScreen

我对这些值进行了实验,似乎在开始这个过程之前将两者都设置为50000会将键盘的左上角定位到屏幕的中心。将两者都设置为0将其准确地定位在左上角,而100000则表示相应的右上角。

 类似资料:
  • 是否隐藏聊窗键盘区域预览图片长图、GIF标识 /** 是否隐藏聊窗键盘区域预览图片长图、GIF标识 @param isHidden 是否隐藏(默认显示) */ [Ntalker ntalker_isHiddenLongImageOrGifLogo:NO];

  • 问题内容: 我正在尝试将ID为“ absPos”的div相对于其父div放在绝对位置。但它不起作用,div放置在页面的左上角。 我的代码示例如下 您能帮我解决这个问题吗?在我的实际情况下,我必须放置背景图像,而不是红色背景色。 问候 问题答案: 绝对定位的元素从其最近的祖先开始定位。在您的代码中,祖先都不是“定位”元素,因此div从body元素(即)偏移。 解决方案是将其应用于父div,这迫使它成

  • 请查看下面的编辑。 所以我已经寻找了很多“解决方案”来解决我的问题,但我似乎无法让它工作。 下面的代码就是我的应用程序的样子: 基本上,我想设置一个按钮的位置,但我无法做到这一点。这是我的密码: 编辑:我现在已经设法创建了一个我最初想要的GUI,但是,我有一个新问题。现在可以从GUI的不同部分按下按钮,而不仅仅是在图像上。对于那些感兴趣的人,以下是我能够完成的: 新的图形用户界面外观。 更新代码:

  • 问题内容: 有人知道如何将文本框中的键盘插入符移动到特定位置吗? 例如,如果一个文本框(例如,输入元素,而不是文本区域)中包含50个字符,而我想将插入号放置在字符20之前,我该如何处理? 这与以下问题有所不同:jQuery在TextArea中设置光标位置,这需要jQuery。 问题答案: 摘自Josh Stodola的使用Javascript在Textbox或TextArea中设置键盘插入符号的位

  • 在web.xml中已经将dispatcher servlet的位置定义为context-param中的[/web-inf/config/dispatcher-servlet.xml],这仍然是它查找[/web-inf/dispatcher-servlet.xml]的原因。 在[/web-inf/config/dispatcher-servlet.xml]和[/web-inf/dispatcher-

  • 在我的 spring boot 应用程序中,我无法使用在带注释的类上正确排序 swagger JSON。 然后,当我在URL < code > http://localhost:[port]/[servlet-context-path]/v2/API-docs 请求Json输出时,位置顺序似乎不起作用: