2015-09-04 4 views
8

Powerpointのマウスカーソルの下にある単語を知りたいので、スクリーンリーダーに使用することができます。アクセシビリティソリューションは、異なる単語(ブロック)を区別できる場合は許容されます。C#を使用してPowerpoint 2013でマウスカーソルの下に単語を取得するにはどうすればよいですか?

+0

あなたが編集モードに意味するか、コードを実行するために、F5を使っパワーポイントの上にマウスを置きますユーザが何らかのテキストの上にカーソルを移動したときに編集モードで、テキストをクリックし、スライドショーモードで、または???いずれにしても、かなり複雑になる可能性があります。 –

+0

必ずしもスライドショーモードではなく、ユーザがカーソルをテキストの上に置いたとき(ただしextモード編集に入るためにクリックされていない)編集モードの間は必然です。 – tofutim

+1

私はこの作業が想像できる唯一の方法は、カーソル位置を取得してスライド上のすべてのテキストを繰り返し、各文字の境界ボックスのプロパティを見て、カーソル位置が境界ボックス内にあるかどうかを判断することです。最初にテキストを選択するようにユーザーに求めることができない理由はありますか?それは物事をすばらしく単純化するでしょう。 –

答えて

3

あなたが何をしているのかわからない場合、これは実際には本当に難しいです。これを行うには簡単な方法と難しい方法があります。簡単な方法は、Microsoft UIの自動化フレームワーク(Powerpointの自動化を含む)を使用することです。代わりのフレームワークも使用できます。

ハードウェアで直接winpiを使用することができます。

例:現在マウスの下のウィンドウタイトルを取得する。

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(); 
    } 

また、あなたが探している情報が公開されている場合を見つけるために、マイクロソフトスパイ++

enter image description here

を使用することができます。それ以外の場合は、この上に構築されたレイヤーであるオートメーションフレームワークを使用することをお勧めします。 Googleにはこれに関する十分な例があります(洗練されたキーロガーの構築方法も同様です)。

+0

Powerpointからテキストを引き出し、勝利 – tofutim

+0

はい、私はそれが本当に難しいことを知っています - したがって+500 - Powerpoint 2015でそれを行う必要があります。(私は以前のバージョンが動作しています...) – tofutim

+0

PowerPoint 2015はありません。Windowsの場合、2016リリース)、2013年、2010年、2007年など、時間の霧に戻ります。 Mac、2016、2011などの場合、一部のバージョンで動作している場合は、どのバージョンが動作しないのですか。 –

2

マルガスと同じ解決策が思い浮かびました。 UIオートメーションまたはPowerPoint interop。幸いにも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は、ユーザーが上にカーソルを置いたときに

+0

これは有望そうです。 「UIAutomationClient」にはどの参照を含める必要がありますか? UIAutomationClient dllがありますが、これにはSystem.Windows.Automationのみが含まれています。 (.NET 4.5) - それは本当に必要ないと思うよ。 – tofutim

+0

これはまだ質問ですか?私はUIAutomationClient、UIAutomationTypes、およびWindowsBaseを参照しました。 – Cilvic

+0

"UIAutomationClientの使用"をどのようにして得られたかわかりませんが、ちょうどそれを取り出しました。今、私は 'アプリケーションが入力同期呼び出しをディスパッチしているため、発信呼び出しを行うことができません。おそらく、私がどのようにして電話をしているのか... – tofutim

関連する問題