2012-01-03 12 views
16

Automatyzuję scenariusz programu Powerpoint przy użyciu kodowanego interfejsu użytkownika & VSTO. W mojej prezentacji PowerPoint stworzyłem ustawienie "Akcja" na kształcie, aby uruchomić notatnik. Podczas pokazu slajdów muszę wywołać tę akcję, klikając "tekst/kształt", aby otworzyć plik notepad.exe. Czy ktokolwiek mógłby mi pomóc, jak to osiągnąć? Napisałem poniższy kod.Jak programowo uruchomić pokaz slajdów programu PowerPoint?

//To launch Powepoint 
PowerPoint.Application objPPT = new PowerPoint.Application(); 
objPPT.Visible = Office.MsoTriState.msoTrue; 

//Add new presentation 
PowerPoint.Presentations oPresSet = objPPT.Presentations; 
PowerPoint.Presentation oPres = oPresSet.Add(Office.MsoTriState.msoTrue); 

//Add a slide 
PowerPoint.Slides oSlides = oPres.Slides; 
PowerPoint.Slide oSlide = oSlides.Add(1, PowerPoint.PpSlideLayout.ppLayoutTitleOnly); 

//Add text 
PowerPoint.TextRange tr = oSlide.Shapes[1].TextFrame.TextRange; 
tr.Text = "Launch notepad"; 
tr.Select(); 

//Add Action settings on the shape 
oSlide.Shapes[1].ActionSettings[PowerPoint.PpMouseActivation.ppMouseClick].Action = PowerPoint.PpActionType.ppActionRunProgram; 
oSlide.Shapes[1].ActionSettings[PowerPoint.PpMouseActivation.ppMouseClick].Run = "c:\\windows\\notepad.exe"; 

//start slideshow 
objPPT.ActivePresentation.SlideShowSettings.Run(); 

Ten rozpocznie pokaz slajdów do prezentacji i 1 slajd „gdzie ustawienia działania określa się na kształt” zostanie wyświetlone. Jak mogę teraz uruchomić notepad.exe automatycznie poprzez interfejsy API? niestety zakodowany interfejs użytkownika nie może wykryć obiektów na slajdzie. Tak więc opcja kliknięcia myszką w interfejsie użytkownika może nie być możliwa.

[Edytuj] Może trochę przyspieszyć. Mam obiekt kształtu podczas pokazu slajdów. Jest to rozszerzenie powyższego kodu.

PowerPoint.SlideShowWindow oSsWnd = objPPT.ActivePresentation.SlideShowWindow; 
PowerPoint.Shape oShape = oSsWnd.View.Slide.Shapes[1]; 
+0

Jestem niejasne na co próbujesz osiągnąć. Jeśli chcesz utworzyć prezentację, uruchom ją w widoku pokazu slajdów, a następnie uruchom notatnik, dlaczego robi to za pomocą programu PowerPoint? Po uruchomieniu i uruchomieniu pokazu PPT uruchom swój skrypt startowy. –

+0

To jest scenariusz automatyzacji, aby sprawdzić, czy akcja działa poprawnie. Dlatego muszę to zrobić tylko – satya

+0

Widzę. Nie wiem w żaden sposób, aby zautomatyzować kliknięcie dowolnego konkretnego kształtu lub punktu na ekranie. –

Odpowiedz

5

To może być bardziej skomplikowane rozwiązanie niż to, co liczyliśmy, ale jeśli można jakoś określić współrzędne X i Y od swojego „text/kształtu” obiektu na ekranie (być może z Coded UI i VSTO Libraries?), Można użyć metody User32 "SendInput", aby emulować przesuwanie myszy do położenia obiektu, a następnie emulować kliknięcie myszą.

Oto kod do emulowania wejście użytkownika:

int x, y; 
// ... First obtain the X and Y coordinate of the "text/shape" object from APIs 

// 
InputEmulator inputEmulator = new InputEmulator(); 
inputEmulator.MoveMouse(x, y); 
inputEmulator.ClickMouse(); 

I o to okrojona wersja klasy InputEmulator używam naśladować działania systemu Windows Ui:

class InputEmulator 
{ 
    private const int INPUT_MOUSE = 0; 
    private const uint MOUSEEVENTF_MOVE = 0x0001; 
    private const uint MOUSEEVENTF_ABSOLUTE = 0x8000; 
    private const uint MOUSEEVENTF_LEFTDOWN = 0x0002; 
    private const uint MOUSEEVENTF_LEFTUP = 0x0004; 

    public void MoveMouse(int x, int y) 
    { 
     INPUT[] inp = new INPUT[1]; 
     inp[0].type = INPUT_MOUSE; 
     inp[0].mi = createMouseInput(x, y, 0, 0, MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE); 


     SendInput((uint)1, inp, Marshal.SizeOf(inp[0].GetType())); 
    } 

    public void ClickMouse() 
    { 
     INPUT[] inp = new INPUT[2]; 
     inp[0].type = INPUT_MOUSE; 
     inp[0].mi = createMouseInput(0, 0, 0, 0, MOUSEEVENTF_LEFTDOWN); 
     inp[1].type = INPUT_MOUSE; 
     inp[1].mi = createMouseInput(0, 0, 0, 0, MOUSEEVENTF_LEFTUP); 
     SendInput((uint)inp.Length, inp, Marshal.SizeOf(inp[0].GetType())); 
    } 

    [DllImport("user32.dll", SetLastError = true)] 
    private static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize); 

    private static MOUSEINPUT createMouseInput(int x, int y, uint data, uint t, uint flag) 
    { 
     MOUSEINPUT mi = new MOUSEINPUT(); 
     mi.dx = x; 
     mi.dy = y; 
     mi.mouseData = data; 
     mi.time = t; 
     //mi.dwFlags = MOUSEEVENTF_ABSOLUTE| MOUSEEVENTF_MOVE; 
     mi.dwFlags = flag; 
     return mi; 
    } 

    [StructLayout(LayoutKind.Explicit)] 
    private struct INPUT 
    { 
     [FieldOffset(0)] 
     public int type; 
     [FieldOffset(sizeof(int))] //[FieldOffset(8)] for x64 
     public MOUSEINPUT mi; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    struct MOUSEINPUT 
    { 
     public int dx; 
     public int dy; 
     public uint mouseData; 
     public uint dwFlags; 
     public uint time; 
     public IntPtr dwExtraInfo; 
    } 
} 
+0

Dzięki nomizzz. Wygląda obiecująco. Spróbuję to zaimplementować, gdy moje poszukiwania rozwiązania opartego na SDK staną się daremne. – satya

7

Nie zapytaj mnie, dlaczego C# zachowuje się tak, ale tak jest!

Musisz wydać polecenie dwukrotnie go do pracy ...

sprawdzony

private void button1_Click(object sender, EventArgs e) 
    { 
     //To launch Powepoint 
     PowerPoint.Application objPPT = new PowerPoint.Application(); 
     objPPT.Visible = Microsoft.Office.Core.MsoTriState.msoTrue; 

     //Add new presentation 
     PowerPoint.Presentations oPresSet = objPPT.Presentations; 
     PowerPoint.Presentation oPres = oPresSet.Add(Microsoft.Office.Core.MsoTriState.msoTrue); 

     //Add a slide 
     PowerPoint.Slides oSlides = oPres.Slides; 
     PowerPoint.Slide oSlide = oSlides.Add(1, PowerPoint.PpSlideLayout.ppLayoutTitleOnly); 

     //Add text 
     PowerPoint.TextRange tr = oSlide.Shapes[1].TextFrame.TextRange; 
     tr.Text = "Launch notepad"; 
     //tr.Select(); 

     //Add Action settings on the shape 
     oSlide.Shapes[1].ActionSettings[PowerPoint.PpMouseActivation.ppMouseClick].Action = PowerPoint.PpActionType.ppActionRunProgram; 
     oSlide.Shapes[1].ActionSettings[PowerPoint.PpMouseActivation.ppMouseClick].Run = @"C:\WINDOWS\system32\notepad.exe"; 
     oSlide.Shapes[1].ActionSettings[PowerPoint.PpMouseActivation.ppMouseClick].Action = PowerPoint.PpActionType.ppActionRunProgram; 
     oSlide.Shapes[1].ActionSettings[PowerPoint.PpMouseActivation.ppMouseClick].Run = @"C:\WINDOWS\system32\notepad.exe"; 
     //start slideshow 
     objPPT.ActivePresentation.SlideShowSettings.Run(); 

    } 

HTH

Sid

+0

Przepraszam Siddhart. Szukam tego, jak "wywołać" akcję podczas pokazu slajdów. Twój kod pomaga tylko ustawić ustawienie akcji na kształcie, o którym już wiem. Mam nadzieję, że masz różnicę. Wciąż szukam odpowiedzi. – satya

Powiązane problemy