加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

有什么办法可以将MS Office平滑打字整合到C#应用程序中吗?

发布时间:2020-12-15 03:47:03 所属栏目:百科 来源:网络整理
导读:在我看来,MS Office平滑打字是Office套件中非常创新的功能,我想知道这个功能是否适用于.NET Framework中的程序员,特别是C#语言. 如果是这样,你可以在你的答案中发布文档的链接,也可能是一个使用示例? 谢谢. 解决方法 我没有办公室,所以我不能看这个功能,但
在我看来,MS Office平滑打字是Office套件中非常创新的功能,我想知道这个功能是否适用于.NET Framework中的程序员,特别是C#语言.

如果是这样,你可以在你的答案中发布文档的链接,也可能是一个使用示例?

谢谢.

解决方法

我没有办公室,所以我不能看这个功能,但是我需要在RichTextBoxes前面提到一些插入符号,并且认为这不值得.基本上你是自己的.没有.NET的帮助函数,但是一切都由后台Win32控件处理.你将很难打败罩下已经发生的事情.并且可能最终截断窗口消息和许多丑陋的代码.

所以我的基本建议是:不要这样做至少对于基本的窗体控件,如TextBox或RichTextBox.您可能会有更多的运气尝试从.NET远程访问运行的办公室,但这是一个完全不同的蠕虫病毒.

如果你真的坚持要去SetCaretPos路线,这里有一些代码可以让你运行一个基本的版本,你可以改进:

// import the functions (which are part of Win32 API - not .NET)
[DllImport("user32.dll")] static extern bool SetCaretPos(int x,int y);
[DllImport("user32.dll")] static extern Point GetCaretPos(out Point point);

public Form1()
{
    InitializeComponent();

    // target position to animate towards
    Point targetCaretPos; GetCaretPos(out targetCaretPos);

    // richTextBox1 is some RichTextBox that I dragged on the form in the Designer
    richTextBox1.TextChanged += (s,e) =>
        {
            // we need to capture the new position and restore to the old one
            Point temp;
            GetCaretPos(out temp);
            SetCaretPos(targetCaretPos.X,targetCaretPos.Y);
            targetCaretPos = temp;
        };

    // Spawn a new thread that animates toward the new target position.
    Thread t = new Thread(() => 
    {
        Point current = targetCaretPos; // current is the actual position within the current animation
        while (true)
        {
            if (current != targetCaretPos)
            {
                // The "30" is just some number to have a boundary when not animating
                // (e.g. when pressing enter). You can experiment with your own distances..
                if (Math.Abs(current.X - targetCaretPos.X) + Math.Abs(current.Y - targetCaretPos.Y) > 30)
                    current = targetCaretPos; // target too far. Just move there immediately
                else
                {
                    current.X += Math.Sign(targetCaretPos.X - current.X);
                    current.Y += Math.Sign(targetCaretPos.Y - current.Y);
                }

                // you need to invoke SetCaretPos on the thread which created the control!
                richTextBox1.Invoke((Action)(() => SetCaretPos(current.X,current.Y)));
            }
            // 7 is just some number I liked. The more,the slower.
            Thread.Sleep(7);
        }
    });
    t.IsBackground = true; // The animation thread won't prevent the application from exiting.
    t.Start();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读