2012-01-03 8 views
16

Sto automatizzando uno scenario Powerpoint utilizzando l'interfaccia utente codificata & VSTO. Nella mia presentazione in PowerPoint ho creato un'impostazione "Azione" su una forma per avviare il blocco note. Durante la presentazione devo richiamare questa azione facendo clic sul 'testo/forma' in modo che apra notepad.exe. Qualcuno potrebbe aiutarmi a raggiungere questo obiettivo. Ho scritto il seguente codice.Come richiamare un'azione durante la presentazione powerpoint a livello di programmazione?

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

Questo lancerà la presentazione per la presentazione e la prima slide 'in cui le impostazioni di azione sono definiti sulla forma' sarà visualizzato. Ora come posso lanciare notepad.exe automaticamente attraverso le API? sfortunatamente l'interfaccia utente codificata non è in grado di rilevare oggetti in una diapositiva. Quindi un'opzione di clic del mouse dell'interfaccia utente potrebbe non essere possibile.

[Modifica] In grado di fare progressi un po '. Ho ottenuto oggetti di forma durante la presentazione. Questa è l'estensione al codice sopra.

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

Sono poco chiaro su cosa stai cercando di realizzare. Se si desidera creare una presentazione, avviarla nella visualizzazione presentazione e quindi avviare Blocco note, perché farlo tramite PowerPoint? Chiedi al tuo codice di aprire il blocco note dopo aver creato e lanciato lo spettacolo PPT. –

+0

Questo è uno scenario di automazione per verificare che l'azione funzioni correttamente. Quindi devo fare in questo modo solo – satya

+0

vedo. Non conosco alcun modo per automatizzare un clic su una particolare forma o punto sullo schermo. –

risposta

5

Questa potrebbe essere una soluzione più complicato di quello che speravano, ma se si potesse in qualche modo determinare la X e la coordinata Y del vostro "/ forma testo" oggetto sullo schermo (magari con l'Coded UI e Librerie VSTO?), È possibile utilizzare il metodo "SendInput" User32 per emulare lo spostamento del mouse nella posizione dell'oggetto e quindi emulare un clic del mouse.

Ecco il codice per emulare l'input dell'utente:

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

E qui è una versione ridotta di una classe InputEmulator io uso per emulare le azioni di 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

Grazie nomizzz. Sembra promettente. Proverò a implementarlo una volta che la mia ricerca di una soluzione basata su SDK sarà inutile. – satya

7

Non chiedimi perché C# si comporta come questo, ma lo fa!

Devi eseguire il comando due volte per farlo funzionare ...

collaudato

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

Siamo spiacenti Siddhart .. Quello che sto cercando è come "invocare" l'azione durante la presentazione della presentazione. Il tuo codice aiuta solo come impostare un'azione su una forma che già conosco. Spero tu abbia ottenuto la differenza. Sto ancora cercando la risposta. – satya

Problemi correlati