2015-09-04 25 views
8

Chciałbym poznać słowo pod kursorem myszy w programie Powerpoint, aby można było go używać z czytnikiem ekranu. Rozwiązania dotyczące dostępności są dopuszczalne, jeśli potrafią rozróżnić różne słowa (a blok).Jak mogę uzyskać słowo pod kursorem myszy w programie Powerpoint 2013 przy użyciu C#?

+0

masz na myśli w trybie edycji, gdy użytkownik umieszcza kursor nad tekst i kliknięty, w trybie edycji, gdy użytkownik przesunął kursor nad tekstem, w trybie pokazu slajdów lub ??? W każdym razie może to być dość skomplikowane. –

+0

Nie zawsze w trybie pokazu slajdów, ale w trybie edycji, gdy użytkownik umieścił kursor nad tekstem (ale nie kliknął, aby przejść do edycji w trybie wymuszenia). – tofutim

+1

Jedyny sposób, w jaki mogę sobie wyobrazić, że działa to, aby uzyskać pozycję kursora, a następnie przejrzeć cały tekst na slajdzie, spójrz na właściwości ramki granicznej dla każdego znaku, aby określić, czy pozycja kursora znajduje się w ramce ograniczającej. Czy jest jakiś powód, dla którego nie możesz poprosić użytkownika, aby najpierw wybrał tekst? To by ogromnie uprościło sprawy. –

Odpowiedz

3

To naprawdę trudne, jeśli nie wiesz, co robisz. Jest łatwy i trudny sposób na zrobienie tego. Łatwym sposobem byłoby wykorzystanie platformy automatyzacji Microsoft UI (obejmującej automatyzację Powerpoint). Można również zastosować alternatywne ramy.

Twardym sposobem jest bezpośrednie użycie aplikacji win api.

Na przykład: Aby uzyskać tytuł okna pod bieżącą myszą.

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

i

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

Dodatkowo można użyć programu Microsoft Spy ++

enter image description here

znaleźć, jeśli informacja szukasz jest narażona. Poza tym, że naprawdę mogę polecić, użyj struktury automatyzacji, która jest warstwą zbudowaną na tym. Google ma więcej przykładów na ten temat (a także jak budować zaawansowane keyloggery).

+0

Pokaż przykład pobierania tekstu z programu Powerpoint i ciebie wygrać – tofutim

+0

I tak, wiem, że to naprawdę trudne - stąd +500 - trzeba to zrobić na Powerpoint 2015. (Mam poprzednie wersje działające ...) – tofutim

+0

Nie ma PowerPoint 2015. Jeśli Windows, możesz mieć 2016 (podgląd release), 2013, 2010, 2007 i tak dalej, z powrotem w mgły czasu. Jeśli Mac, 2016, 2011, itd. Więc jeśli masz działające w niektórych wersjach, w jakiej wersji nie działa, a co dokładnie nie działa? –

2

Te same rozwiązania, co Margus, przyszły mi na myśl. Interfejs użytkownika Automatyzacja lub program PowerPoint. Na szczęście działa UI Automation.

Poniższy tekst działa w moim teście, umieszczając mysz nad polem tekstowym programu PowerPoint 2013. Daj mi znać, jeśli uważasz, że czegoś brakuje.

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"; 
     } 
    } 

Aktualizacja Próbkahttp://download.veodin.com/misc/PowerPoint_Screen_Reader.zip

ostrości Visual Studio, umieścić kursor myszy nad PowerPoint następnie użyj F5, aby uruchomić kod

+0

To wygląda obiecująco. Które odniesienie należy uwzględnić w przypadku "UIAutomationClient"? Istnieje dll UIAutomationClient, ale zawiera tylko System.Windows.Automation. (.NET 4.5) - oops, myślę, że to naprawdę nie jest potrzebne. – tofutim

+0

Czy to wciąż pytanie? Wymieniłem UIAutomationClient, UIAutomationTypes i WindowsBase. – Cilvic

+0

Nie jestem pewien, w jaki sposób można uzyskać "za pomocą UIAutomationClient", ale po prostu go wyłączyłem. W tej chwili utknąłem w "Połączenie wychodzące nie może być wykonane, ponieważ aplikacja wysyła wywołanie synchroniczne wejścia". prawdopodobnie z powodu tego, jak wykonuję połączenie ... – tofutim

Powiązane problemy