23. oktober 2004 - 16:17Der er
18 kommentarer og 1 løsning
Styring af PowerPoint præsentation
Jeg skal via .NET kode styre en eventuel PowerPoint præsentation der kører på systemet. Om den kører via F5 inde i PowerPoint selv, eller om det er en reel præsentationsfil der bliver kørt uden om PowerPoint selv, så skal jeg kunne styre begge. Ved hjælp af Spy++ har jeg forsøgt at få fat i vinduets handle for så at kunne sende beskeder, men jeg kan kun få fat i vinduets klasse. Præsentationen som kører under selve PP har ikke nogen vindues tekst, det har den selvstændige præsentationsfil derimod. Hvis jeg vha Win32 API'et kalder GetWindow() funktionen og bruger både vinduets tekst, og dets klasse, så kan jeg godt finde dets handle. Men den kan ikke finde det udelukkende ud fra vinduets klasse (paneClassDC såvidt jeg husker).
Selv når jeg har vinduets handle, så er det ikke lykkedes mig at snakke med det. Alt jeg skal kunne er at simulere et tryk på SPACE, eller et tryk med musen, for at få præsentationen til at gå videre.
Hvordan kan det gøres? Er der nogle indbyggede COM biblioteker jeg skal bruge? Er der en nemmere måde?
Formentligt, jeg ved bare ikke hvilken besked jeg skal sende til den før den reagerer. Jeg har prøvet de fleste jeg kan se igennem Spy++, men jeg kan ikke få den til at reagere.
jeg har office 2000, og når man trykker F5 (for diasshow) så skiftes der slide når man sender en:
// 0x0111 er WM_COMMAND // wPAram : hiword = 0x0001 hvilket er en accelerator, loWord er ID'et på acceleratoren // handle er hwnd på diasshow - vinduet SendMessage(handle, 0x0111, 0x00010189, 0x00000000);
Takker, det virker! Jeg er dog meget interesseret i hvordan du kom frem til den WM_COMMAND, for den opstår ikke hos mig. Jeg bruger Office XP, og jeg kan ikke umiddelbart se nogen WM_COMMAND hverken ved brug af mus eller tastatur til at skifte slides.
Hvordan loggede du den besked? Hvilket vindue loggede du? Og forresten, når jeg kalder SendMessage(0x1059a, 0x0111, 0x0001013c, 0x00000000); så fungerer det både til en selvstændig præsentation og en F5 igennem PP selv, jeg behøver ikke PostMessage.
>Jeg er dog meget interesseret i hvordan du kom frem til den WM_COMMAND, >for den opstår ikke hos mig. jeg gjorde:
* startede PP * startede spy++ * så fandt jeg PP i spy++ og klikkede på det * så klikkede jeg på messages iconet i toolbaren, så man får de mere advancerede muligheder * under windows tabben tjekkede jeg "children" af * under messages tabben valgte jeg WM_COMMAND i listboxen og derefter tjekkede jeg keyboard af. trykkede OK tilsidst * nu var spy++ sat op til det helt store, så jeg gik over i PP og klikkede på første slide * herefter trykkede jeg på CTRL+Pil ned, og ALT+TAB'ede tilbage til spy++ * i spy++ så jeg så efter WM_KEYDOWN beskeden (ang. pil ned) * og så klikkede jeg på den message der var blevetsendt lige efter! * denne besked var så WM_COMMAND med accelerator ID = 0x13c
grunden til at jeg kiggede på den besked efter var at jeg heller ikke kunne få det til at virke når man bare sendte WM_KEYDOWN beskeden til PP. Så jeg tænkte at der nok var sat nogle accelerator key's i power point som satte hele "next slide" processen igang.. og det var der så - heldigt :)
jeg har forsøgt at skrive det udførligt, så folk der ikke er vandt til spy++ oxo kan ffå gavn af det...
Jeg har lige forsøgt at gøre processen efter, og nu får jeg da også nogle WM_COMMANDs, men stadig synes jeg ikke jeg kan få det til at funke.
Først, hvorfor trykker du CTRL+NED inde i PowerPoint, det skifter slide i selve PP, men ikke i slide showet. Vha. CTRL+NED får jeg følgende WM_COMMAND: <00006> 000C028E S WM_COMMAND wNotifyCode:1 (sent from an accelerator) wID:316
Den har en wParam = 0x0001013C hvilket vel passer udemærket ifht. hvad du skrev. Men hvis jeg kalder SendMessage med Win32.SendMessage(handle.ToInt32(), Win32.WM_COMMAND, 0x0001013C, 0x00000000);, så får jeg bare et "dyt", der sker ikke andet. Kun hvis jeg kalder den med wParam = 0x00010189 virker det. Hvor fik du wParam = 0x00010189 fra?
1) Ang. ctrl+ned : jeg trykkede Ctrl+ned inde i PP, fordi jeg stod i den der "oversigts ting" i venstre side, hvis man bare trykkede ned gik cursoren ned gennem slidens overskrifts tekst - så man ikke rigtigt kunne hvide hvornår næste slide kom (det er office 2000, er layoutet mon anderledes i officeXP? jeg ved det ikke)
2) jeg fik 0x00010189 da jeg gjorde samme øvelse, men bare på det vindue der kommer når man trykker F5 (det som fylder hele skærmen)
jeg er lige blevet forvirret :) virkede denne der 0001013c ikke alligevel (øv?!) ? 2)
0x0001013c virker ikke :(. Det g'r 0x00010189 derimod. 13c resulterer bare i et "dyt" fra systemet, hvorimod at 189 skifter til næste slide. Det er forsåvidt også fint nok (du skal også nok få point for svaret), jeg ville bare gerne kunne reproducere det, så jeg også kunne udforske hvilken kode jeg skal sende for f.eks at gå tilbage, lukke slide showet osv.
Såvidt jeg forstår, så fik du koden 0x00010189 på selve slide show vinduet, og altså ikke på selve PP main vinduet? Jeg vil lige prøve at eksperimentere lidt mere.
Min første mistanke gik selvfølgelig på at 189 var koden i Office 2000, og at 13c var koden i Office XP, men den funker bare ikke :(
Så fik jeg den til at fungere! Mit problem var at jeg kun fik kigget på selve præsentationsvinduet, uden at kigge på de andre skjulte vinduer som kører under samme process. Ved at afsøge alle vinduer under samme process, så fik jeg accelerator koderne, og det funker helt perfekt :)
Jeg takker mange gange for din hjælp, smid et svar og du skal få dine velfortjente point :)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.