如何使用C#在Powerpoint 2013中获取鼠标光标下的单词?

时间:2015-09-04 16:00:05

标签: c# powerpoint

我想知道Powerpoint中鼠标光标下的单词,以便它可以用于屏幕阅读器。可访问性解决方案是可以接受的,如果它可以区分不同的单词(与块)。

2 个答案:

答案 0 :(得分:3)

如果你不知道自己在做什么,这实际上真的很难。有一种简单的方法,也很难做到这一点。简单的方法是使用Microsoft UI自动化框架(包括Powerpoint自动化)。也可以使用替代框架。

很难直接使用win api。

例如:要获取当前鼠标下的窗口标题。

    public static class dllRef
    {
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool GetCursorPos(out Point lpPoint);
        [DllImport("user32.dll")]
        private static extern IntPtr WindowFromPoint(Point point);
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern int RegisterWindowMessage(string lpString);
        [DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Auto)]
        public static extern bool SendMessage(IntPtr hWnd, uint Msg, int wParam, StringBuilder lParam);
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr SendMessage(int hWnd, int Msg, int wparam, int lparam);

        public const int WM_USER = 0x400;
        public const int WM_COPYDATA = 0x4A;
        public const int WM_GETTEXT = 0x000D;
        public const int WM_GETTEXTLENGTH = 0x000E;

        public static void RegisterControlforMessages()
        {
            RegisterWindowMessage("WM_GETTEXT");
        }

        public static string GetText()
        {
            StringBuilder title = new StringBuilder();
            Point p = dllRef.getMousePosition();
            var lhwnd = dllRef.WindowFromPoint(p);
            var lTextlen = dllRef.SendMessage((int)lhwnd, dllRef.WM_GETTEXTLENGTH, 0, 0).ToInt32();
            if (lTextlen > 0)
            {
                title = new StringBuilder(lTextlen + 1);
                SendMessage(lhwnd, WM_GETTEXT, title.Capacity, title);
            }
            return title.ToString();
        }

        public static Point getMousePosition()
        {
            Point p = new Point();
            GetCursorPos(out p);
            return p;
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Timer t = new Timer();
        t.Interval = 25;
        t.Tick += new EventHandler(Timer_Tick);
        t.Start();
    }
    public void Timer_Tick(object sender, EventArgs eArgs)
    {
        this.label1.Text = dllRef.GetText();
    }

此外,您可以使用Microsoft Spy ++

enter image description here

查找您要查找的信息是否已公开。除此之外,我真的可以建议你使用基于此构建的层的自动化框架。谷歌有足够多的例子(以及如何构建复杂的键盘记录器)。

答案 1 :(得分:2)

与Margus相同的解决方案浮现在脑海中。 UI自动化或PowerPoint互操作。幸运的是UI自动化工作。

以下工作在我的测试中将鼠标放在PowerPoint 2013文本框上。如果您认为缺少某些内容,请告诉我。

using System.Windows.Automation;
using UIAutomationClient;    

String TextUnderCursor()
    {
        System.Windows.Point point = new System.Windows.Point(Cursor.Position.X, Cursor.Position.Y);
        AutomationElement element = AutomationElement.FromPoint(point);
        object patternObj;
        if (element.TryGetCurrentPattern(TextPattern.Pattern, out patternObj))
        {
            var textPattern = (TextPattern)patternObj;
            return textPattern.DocumentRange.GetText(-1).TrimEnd('\r'); // often there is an extra '\r' hanging off the end.)
        } else
        {
            return "no text found";
        }
    }

更新示例 http://download.veodin.com/misc/PowerPoint_Screen_Reader.zip

聚焦Visual Studio,将鼠标放在PowerPoint上,然后使用F5运行代码