tecla presentacion predefinidos power para nombres los interactivos interacciones iniciar hacer funciones como botones aplicar animados acción accion c# vba vsto powerpoint powerpoint-vba

c# - presentacion - ¿Cómo invocar una acción durante la presentación de diapositivas en powerpoint mediante programación?



nombres de los botones de accion en power point (2)

Estoy automatizando un escenario de Powerpoint utilizando UI codificada y VSTO. En mi presentación en Powerpoint, he creado una configuración de ''Acción'' en una forma para lanzar el bloc de notas. Durante la presentación de diapositivas, necesito invocar esta acción haciendo clic en ''texto / forma'' para que abra notepad.exe. ¿Alguien podría ayudarme a lograr esto? Escribí el siguiente código.

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

Esto iniciará la presentación de diapositivas de la presentación y se mostrará la primera diapositiva ''donde se definen los ajustes de acción en la forma''. Ahora, ¿cómo puedo iniciar notepad.exe automáticamente a través de APIs? desafortunadamente, la IU codificada no puede detectar objetos en una diapositiva. Por lo tanto, una opción de clic del mouse en la interfaz de usuario puede no ser posible

[Editar] Capaz de hacer poco progreso. Tengo forma de objeto durante la presentación de diapositivas. Esta es la extensión del código anterior.

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


Esta podría ser una solución más complicada de lo que esperabas, pero si pudieras determinar de alguna manera las coordenadas X e Y de tu objeto de "texto / forma" en la pantalla (¿quizás con la IU codificada y las bibliotecas de VSTO?), Podrías use el método "SendInput" de User32 para emular mover el mouse a la ubicación del objeto y luego emular un clic del mouse.

Aquí está el código para emular la entrada del usuario:

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

Y aquí hay una versión reducida de una clase InputEmulator que uso para emular las acciones de la interfaz de usuario de Windows:

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


No me preguntes por qué C # se comporta así, ¡pero sí!

Tienes que ejecutar el comando dos veces para que funcione ...

Tratado y probado

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