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

tof*_*tim 8 c# powerpoint

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

Mar*_*gus 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

    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();
    }
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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