我想知道Powerpoint中鼠标光标下的单词,以便它可以用于屏幕阅读器。可访问性解决方案是可以接受的,如果它可以区分不同的单词(与块)。
答案 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 ++
查找您要查找的信息是否已公开。除此之外,我真的可以建议你使用基于此构建的层的自动化框架。谷歌有足够多的例子(以及如何构建复杂的键盘记录器)。
答案 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运行代码