From 8d0864b1e9fdaa98629f73da5074feeaf5299f34 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Wed, 10 Dec 2008 20:46:04 +0000 Subject: [PATCH] Moved to plugins bzr-revno: 207 --- openlp/libraries/pptviewlib/README.TXT | 116 --- openlp/libraries/pptviewlib/ppttest.py | 146 ---- openlp/libraries/pptviewlib/pptviewlib.cpp | 738 ------------------ openlp/libraries/pptviewlib/pptviewlib.dll | Bin 80896 -> 0 bytes openlp/libraries/pptviewlib/pptviewlib.h | 54 -- openlp/libraries/pptviewlib/pptviewlib.vcproj | 203 ----- openlp/libraries/pptviewlib/test.ppt | Bin 21504 -> 0 bytes 7 files changed, 1257 deletions(-) delete mode 100644 openlp/libraries/pptviewlib/README.TXT delete mode 100644 openlp/libraries/pptviewlib/ppttest.py delete mode 100644 openlp/libraries/pptviewlib/pptviewlib.cpp delete mode 100644 openlp/libraries/pptviewlib/pptviewlib.dll delete mode 100644 openlp/libraries/pptviewlib/pptviewlib.h delete mode 100644 openlp/libraries/pptviewlib/pptviewlib.vcproj delete mode 100644 openlp/libraries/pptviewlib/test.ppt diff --git a/openlp/libraries/pptviewlib/README.TXT b/openlp/libraries/pptviewlib/README.TXT deleted file mode 100644 index 43954d150..000000000 --- a/openlp/libraries/pptviewlib/README.TXT +++ /dev/null @@ -1,116 +0,0 @@ - -PPTVIEWLIB - Control PowerPoint Viewer 2003/2007 (for openlp.org) -Copyright (C) 2008 Jonathan Corwin (j@corwin.co.uk) - -This library wrappers the free Microsoft PowerPoint Viewer (2003/2007) program, -allowing it to be more easily controlled from another program. - -The PowerPoint Viewer must already be installed on the destination machine, and is -freely available at microsoft.com. - -The full Microsoft Office PowerPoint and PowerPoint Viewer 97 have a COM interface allowing -automation. This ability was removed from the 2003+ viewer offerings. - -To developers: I am not a C/C++ or Win32 API programmer as you can probably tell. -The code and API of this DLL could certainly do with some tidying up, and the -error trapping, where it exists, is very basic. I'll happily accept patches! - -This library is covered by the GPL (http://www.gnu.org/licenses/) -It is NOT covered by the LGPL, so can only be used in GPL compatable programs. -(http://www.gnu.org/licenses/why-not-lgpl.html) - -This README.TXT must be distributed with the pptviewlib.dll - -This library has a limit of 50 PowerPoints which can be opened simultaneously. - -USAGE ------ -int OpenPPT(char *filename, HWND hParentWnd, RECT rect, char *previewpath); - - Opens the PowerPoint file, counts the number of slides, sizes and positions accordingly - and creates preview images of each slide. Note PowerPoint Viewer only allows the - slideshow to be resized whilst it is being loaded. It can be moved at any time however. - - The only way to count the number of slides is to step through the entire show. Therefore - there will be a delay whilst opening large presentations for the first time. - For pre XP/2003 systems, the slideshow will flicker as the screen snapshots are taken. - - filename: The PowerPoint file to be opened. Full path - hParentWnd: The window which will become the parent of the slideshow window. - Can be NULL. - rect: The location/dimensions of the slideshow window. - If all properties of this structure are zero, the dimensions of the hParentWnd - are used. - previewpath If specified, the prefix to use for snapshot images of each slide, in the - form: previewpath + n + ".bmp", where n is the slide number. - A file called previewpath + "info.txt" will also be created containing information - about the PPT file, to speed up future openings of the unmodified file. - Note it is up the calling program to directly access these images if they - are required. - - RETURNS: An unique identifier to pass to other methods in this library. - If < 0, then the PPT failed to open. - If >=0, ClosePPT must be called when the PPT is no longer being used - or when the calling program is closed to release resources/hooks. - -void ClosePPT(int id); - Closes the presentation, releasing any resources and hooks. - - id: The value returned from OpenPPT. - -int GetCurrentSlide(int id); - Returns the current slide number (from 1) - - id: The value returned from OpenPPT. - -int GetSlideCount(int id); - Returns the total number of slides. - - id: The value returned from OpenPPT. - -void NextStep(int id); - Advances one step (animation) through the slideshow. - - id: The value returned from OpenPPT. - -void PrevStep(int id); - Goes backwards one step (animation) through the slideshow. - - id: The value returned from OpenPPT. - -void GotoSlide(int id, int slideno); - Goes directly to a specific slide in the slideshow - - id: The value returned from OpenPPT. - slideno: The number of the slide (from 1) to go directly to. - - If the slide has already been displayed, then the completed slide with animations performed - will be shown. This is how the PowerPoint Viewer works so have no control over this. - -void RestartShow(int id); - Restarts the show from the beginning. To reset animations, behind the scenes it - has to travel to the end and step backwards though the entire show. Therefore - for large presentations there might be a delay. - - id: The value returned from OpenPPT. - -void Blank(int id); - Blanks the screen, colour black. - - id: The value returned from OpenPPT. - -void Unblank(int id) - Unblanks the screen, restoring it to it's pre-blank state. - - id: The value returned from OpenPPT. - -void Stop(int id) - Moves the slideshow off the screen. (There is no concept of stop show in the PowerPoint Viewer) - - id: The value returned from OpenPPT. - -void Resume(int id) - Moves the slideshow display back onto the screen following a Stop() - - id: The value returned from OpenPPT. - diff --git a/openlp/libraries/pptviewlib/ppttest.py b/openlp/libraries/pptviewlib/ppttest.py deleted file mode 100644 index 84f6fb527..000000000 --- a/openlp/libraries/pptviewlib/ppttest.py +++ /dev/null @@ -1,146 +0,0 @@ -import sys -from PyQt4 import QtGui, QtCore -from ctypes import * -from ctypes.wintypes import RECT - -class PPTViewer(QtGui.QWidget): - def __init__(self, parent=None): - QtGui.QWidget.__init__(self, parent) - self.pptid = -1 - self.setWindowTitle('PowerPoint Viewer Test') - - PPTLabel = QtGui.QLabel('Open PowerPoint file') - slideLabel = QtGui.QLabel('Go to slide #') - self.PPTEdit = QtGui.QLineEdit() - self.slideEdit = QtGui.QLineEdit() - self.total = QtGui.QLabel() - PPTBtn = QtGui.QPushButton("Open") - PPTDlgBtn = QtGui.QPushButton("...") - slideBtn = QtGui.QPushButton("Go") - prev = QtGui.QPushButton("Prev") - next = QtGui.QPushButton("Next") - blank = QtGui.QPushButton("Blank") - unblank = QtGui.QPushButton("Unblank") - restart = QtGui.QPushButton("Restart") - close = QtGui.QPushButton("Close") - resume = QtGui.QPushButton("Resume") - stop = QtGui.QPushButton("Stop") - pptwindow = QtGui.QWidget() - - grid = QtGui.QGridLayout() - grid.addWidget(PPTLabel, 0, 0) - grid.addWidget(self.PPTEdit, 0, 1) - grid.addWidget(PPTDlgBtn, 0, 2) - grid.addWidget(PPTBtn, 0, 3) - grid.addWidget(slideLabel, 1, 0) - grid.addWidget(self.slideEdit, 1, 1) - grid.addWidget(slideBtn, 1, 3) - grid.addWidget(prev, 2, 0) - grid.addWidget(next, 2, 1) - grid.addWidget(blank, 3, 0) - grid.addWidget(unblank, 3, 1) - grid.addWidget(restart, 4, 0) - grid.addWidget(close, 4, 1) - grid.addWidget(stop, 5, 0) - grid.addWidget(resume, 5, 1) - grid.addWidget(pptwindow, 6, 0, 10, 3) - self.connect(PPTBtn, QtCore.SIGNAL('clicked()'), self.OpenClick) - self.connect(PPTDlgBtn, QtCore.SIGNAL('clicked()'), self.OpenDialog) - self.connect(slideBtn, QtCore.SIGNAL('clicked()'), self.GotoClick) - self.connect(prev, QtCore.SIGNAL('clicked()'), self.PrevClick) - self.connect(next, QtCore.SIGNAL('clicked()'), self.NextClick) - self.connect(blank, QtCore.SIGNAL('clicked()'), self.BlankClick) - self.connect(unblank, QtCore.SIGNAL('clicked()'), self.UnblankClick) - self.connect(restart, QtCore.SIGNAL('clicked()'), self.RestartClick) - self.connect(close, QtCore.SIGNAL('clicked()'), self.CloseClick) - self.connect(stop, QtCore.SIGNAL('clicked()'), self.StopClick) - self.connect(resume, QtCore.SIGNAL('clicked()'), self.ResumeClick) - - self.setLayout(grid) - - self.resize(300, 150) - - def PrevClick(self): - if self.pptid<0: return - pptdll.PrevStep(self.pptid) - self.UpdateCurrSlide() - app.processEvents() - - def NextClick(self): - if(self.pptid<0): return - pptdll.NextStep(self.pptid) - self.UpdateCurrSlide() - app.processEvents() - - def BlankClick(self): - if(self.pptid<0): return - pptdll.Blank(self.pptid) - app.processEvents() - - def UnblankClick(self): - if(self.pptid<0): return - pptdll.Unblank(self.pptid) - app.processEvents() - - def RestartClick(self): - if(self.pptid<0): return - pptdll.RestartShow(self.pptid) - self.UpdateCurrSlide() - app.processEvents() - - def StopClick(self): - if(self.pptid<0): return - pptdll.Stop(self.pptid) - app.processEvents() - - def ResumeClick(self): - if(self.pptid<0): return - pptdll.Resume(self.pptid) - app.processEvents() - - def CloseClick(self): - if(self.pptid<0): return - pptdll.ClosePPT(self.pptid) - self.pptid = -1 - app.processEvents() - - def OpenClick(self): - if(self.pptid>=0): - self.CloseClick() - rect = RECT(100,100,900,700) - filename = str(self.PPTEdit.text()) - print filename - self.pptid = pptdll.OpenPPT(filename, None, rect, "c:\\temp\\slide") - print "id: " + str(self.pptid) - slides = pptdll.GetSlideCount(self.pptid) - print "slidecount: " + str(slides) - self.total.setNum(pptdll.GetSlideCount(self.pptid)) - self.UpdateCurrSlide() - app.processEvents() - - def UpdateCurrSlide(self): - if(self.pptid<0): return - slide = str(pptdll.GetCurrentSlide(self.pptid)) - print "currslide: " + slide - self.slideEdit.setText(slide) - app.processEvents() - - def GotoClick(self): - if(self.pptid<0): return - print self.slideEdit.text() - pptdll.GotoSlide(self.pptid, int(self.slideEdit.text())) - self.UpdateCurrSlide() - app.processEvents() - - def OpenDialog(self): - self.PPTEdit.setText(QtGui.QFileDialog.getOpenFileName(self, 'Open file')) - -if __name__ == '__main__': - pptdll = cdll.LoadLibrary(r"C:\Documents and Settings\jonathan\My Documents\Personal\openlp\openlp-2\trunk\openlp\libraries\pptviewlib\pptviewlib.dll") - pptdll.SetDebug(1) - print "Begin..." - app = QtGui.QApplication(sys.argv) - qb = PPTViewer() - qb.show() - sys.exit(app.exec_()) - diff --git a/openlp/libraries/pptviewlib/pptviewlib.cpp b/openlp/libraries/pptviewlib/pptviewlib.cpp deleted file mode 100644 index 5e2f81d72..000000000 --- a/openlp/libraries/pptviewlib/pptviewlib.cpp +++ /dev/null @@ -1,738 +0,0 @@ -/* - * PPTVIEWLIB - Control PowerPoint Viewer 2003/2007 (for openlp.org) - * Copyright (C) 2008 Jonathan Corwin - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include "pptviewlib.h" - -// Because of the callbacks used by SetWindowsHookEx, the memory used needs to be -// sharable across processes (the callbacks are done from a different process) -// Therefore use data_seg with RWS memory. -// -// See http://msdn.microsoft.com/en-us/library/aa366551(VS.85).aspx for alternative -// method of holding memory, removing fixed limits which would allow dynamic number -// of items, rather than a fixed number. Use a Local\ mapping, since global has UAC -// issues in Vista. -#pragma data_seg(".PPTVIEWLIB") -PPTVIEWOBJ pptviewobj[MAX_PPTOBJS] = {NULL}; -HHOOK globalhook = NULL; -BOOL debug = FALSE; -#pragma data_seg() -#pragma comment(linker, "/SECTION:.PPTVIEWLIB,RWS") - -#define DEBUG(...) if(debug) printf(__VA_ARGS__) - - -HINSTANCE hInstance = NULL; - -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved - ) -{ - hInstance = (HINSTANCE)hModule; - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - break; - case DLL_PROCESS_DETACH: - // Clean up... hopefully there is only the one process attached? - // We'll find out soon enough during tests! - for(int i = 0; i.bmp" will be appended to complete the path. E.g. "c:\temp\slide" would -// create "c:\temp\slide1.bmp" slide2.bmp, slide3.bmp etc. -// It will also create a *info.txt containing information about the ppt -DllExport int OpenPPT(char *filename, HWND hParentWnd, RECT rect, char *previewpath) -{ - STARTUPINFO si; - PROCESS_INFORMATION pi; - char cmdline[MAX_PATH * 2]; - int id; - - DEBUG("OpenPPT start: %s\n", filename); - if(GetPPTViewerPath(cmdline, sizeof(cmdline))==FALSE) - { - DEBUG("OpenPPT: GetPPTViewerPath failed\n"); - return -1; - } - id = -1; - for(int i = 0; ibottom-wndrect->top; - pptviewobj[id].rect.right = wndrect->right-wndrect->left; - } - else - { - pptviewobj[id].rect.top = rect.top; - pptviewobj[id].rect.left = rect.left; - pptviewobj[id].rect.bottom = rect.bottom; - pptviewobj[id].rect.right = rect.right; - } - strcat_s(cmdline, MAX_PATH * 2, "/S \""); - strcat_s(cmdline, MAX_PATH * 2, filename); - strcat_s(cmdline, MAX_PATH * 2, "\""); - memset(&si, 0, sizeof(si)); - memset(&pi, 0, sizeof(pi)); - BOOL gotinfo = GetPPTInfo(id); - if(!CreateProcess(NULL, cmdline, NULL, NULL, FALSE, 0, 0, NULL, &si, &pi)) - { - DEBUG("OpenPPT: CreateProcess failed\n"); - ClosePPT(id); - return -1; - } - - pptviewobj[id].state = PPT_STARTED; - pptviewobj[id].dwProcessId = pi.dwProcessId; - pptviewobj[id].dwThreadId = pi.dwThreadId; - pptviewobj[id].hThread = pi.hThread; - pptviewobj[id].hProcess = pi.hProcess; - /* - * I'd really like to just hook on the new threadid. However this always gives - * error 87. Perhaps I'm hooking to soon? No idea... however can't wait - * since I need to ensure I pick up the WM_CREATE as this is the only - * time the window can be resized in such away the content scales correctly - * - * hook = SetWindowsHookEx(WH_CBT,CbtProc,hInstance,pi.dwThreadId); - */ - if(globalhook!=NULL) - UnhookWindowsHookEx(globalhook); - globalhook = SetWindowsHookEx(WH_CBT,CbtProc,hInstance,NULL); - if(globalhook==0) - { - DEBUG("OpenPPT: SetWindowsHookEx failed\n"); - ClosePPT(id); - return -1; - } - while(pptviewobj[id].state==PPT_STARTED) - Sleep(10); - if(gotinfo) - { - DEBUG("OpenPPT: Info loaded, no refresh\n"); - pptviewobj[id].state = PPT_LOADED; - Resume(id); - } - else - { - //Resume(id); - DEBUG("OpenPPT: Get info\n"); - pptviewobj[id].steps = 0; - int steps = 0; - while(pptviewobj[id].state!=PPT_LOADED&&pptviewobj[id].state!=PPT_CLOSED) - { - if(steps<=pptviewobj[id].steps) - { - Sleep(100); - DEBUG("OpenPPT: Step %d/%d\n",steps,pptviewobj[id].steps); - steps++; - NextStep(id); - } - Sleep(10); - } - DEBUG("OpenPPT: Steps %d, first slide steps %d\n",pptviewobj[id].steps,pptviewobj[id].firstSlideSteps); - SavePPTInfo(id); - RestartShow(id); - } - if(pptviewobj[id].mhook!=NULL) - UnhookWindowsHookEx(pptviewobj[id].mhook); - pptviewobj[id].mhook = NULL; - DEBUG("OpenPPT: Exit: id=%i\n", id); - return id; -} -// Load information about the ppt from an info.txt file. -// Format: -// version -// filedate -// filesize -// slidecount -// first slide steps -BOOL GetPPTInfo(int id) -{ - struct _stat filestats; - char info[MAX_PATH]; - FILE* pFile; - char buf[100]; - - DEBUG("GetPPTInfo: start\n"); - if(_stat(pptviewobj[id].filename, &filestats)!=0) - return FALSE; - sprintf_s(info, MAX_PATH, "%sinfo.txt", pptviewobj[id].previewpath); - int err = fopen_s(&pFile, info, "r"); - if(err!=0) - { - DEBUG("GetPPTInfo: file open failed - %d\n", err); - return FALSE; - } - fgets(buf, 100, pFile); // version == 1 - fgets(buf, 100, pFile); - if(filestats.st_mtime!=atoi(buf)) - { - fclose (pFile); - return FALSE; - } - fgets(buf, 100, pFile); - if(filestats.st_size!=atoi(buf)) - { - fclose (pFile); - return FALSE; - } - fgets(buf, 100, pFile); // slidecount - int slidecount = atoi(buf); - fgets(buf, 100, pFile); // first slide steps - int firstslidesteps = atoi(buf); - // check all the preview images still exist - for(int i = 1; i<=slidecount; i++) - { - sprintf_s(info, MAX_PATH, "%s%i.bmp", pptviewobj[id].previewpath, i); - if(GetFileAttributes(info)==INVALID_FILE_ATTRIBUTES) - return FALSE; - } - fclose(pFile); - pptviewobj[id].slideCount = slidecount; - pptviewobj[id].firstSlideSteps = firstslidesteps; - DEBUG("GetPPTInfo: exit ok\n"); - return TRUE; -} - -BOOL SavePPTInfo(int id) -{ - struct _stat filestats; - char info[MAX_PATH]; - FILE* pFile; - - DEBUG("SavePPTInfo: start\n"); - if(_stat(pptviewobj[id].filename, &filestats)!=0) - { - DEBUG("SavePPTInfo: stat of %s failed\n", pptviewobj[id].filename); - return FALSE; - } - sprintf_s(info, MAX_PATH, "%sinfo.txt", pptviewobj[id].previewpath); - int err = fopen_s(&pFile, info, "w"); - if(err!=0) - { - DEBUG("SavePPTInfo: fopen of %s failed%i\n", info, err); - return FALSE; - } - fprintf(pFile, "1\n"); - fprintf(pFile, "%u\n", filestats.st_mtime); - fprintf(pFile, "%u\n", filestats.st_size); - fprintf(pFile, "%u\n", pptviewobj[id].slideCount); - fprintf(pFile, "%u\n", pptviewobj[id].firstSlideSteps); - fclose (pFile); - DEBUG("SavePPTInfo: exit ok\n"); - return TRUE; -} - -// Get the path of the PowerPoint viewer from the registry -BOOL GetPPTViewerPath(char *pptviewerpath, int strsize) -{ - HKEY hkey; - DWORD dwtype, dwsize; - LRESULT lresult; - - DEBUG("GetPPTViewerPath: start\n"); - if(RegOpenKeyEx(HKEY_CLASSES_ROOT, "Applications\\PPTVIEW.EXE\\shell\\open\\command", 0, KEY_READ, &hkey)!=ERROR_SUCCESS) - return FALSE; - dwtype = REG_SZ; - dwsize = (DWORD)strsize; - lresult = RegQueryValueEx(hkey, NULL, NULL, &dwtype, (LPBYTE)pptviewerpath, &dwsize ); - RegCloseKey(hkey); - if(lresult!=ERROR_SUCCESS) - return FALSE; - pptviewerpath[strlen(pptviewerpath)-4] = '\0'; // remove "%1" from end of key value - DEBUG("GetPPTViewerPath: exit ok\n"); - return TRUE; -} - -// Unhook the Windows hook -void Unhook(int id) -{ - DEBUG("Unhook: start\n"); - if(pptviewobj[id].hook!=NULL) - UnhookWindowsHookEx(pptviewobj[id].hook); - if(pptviewobj[id].mhook!=NULL) - UnhookWindowsHookEx(pptviewobj[id].mhook); - pptviewobj[id].hook = NULL; - pptviewobj[id].mhook = NULL; - DEBUG("Unhook: exit ok\n"); -} - -// Close the PowerPoint viewer, release resources -DllExport void ClosePPT(int id) -{ - DEBUG("ClosePPT: start\n"); - pptviewobj[id].state = PPT_CLOSED; - Unhook(id); - if(pptviewobj[id].hWnd==0) - TerminateThread(pptviewobj[id].hWnd, 0); - else - PostMessage(pptviewobj[id].hWnd, WM_CLOSE, 0, 0); - CloseHandle(pptviewobj[id].hThread); - CloseHandle(pptviewobj[id].hProcess); - memset(&pptviewobj[id], 0, sizeof(PPTVIEWOBJ)); - DEBUG("ClosePPT: exit ok\n"); - return; -} -// Moves the show back onto the display -DllExport void Resume(int id) -{ - DEBUG("Resume:\n"); - MoveWindow(pptviewobj[id].hWnd, pptviewobj[id].rect.left, pptviewobj[id].rect.top, - pptviewobj[id].rect.right - pptviewobj[id].rect.left, - pptviewobj[id].rect.bottom - pptviewobj[id].rect.top, TRUE); - Unblank(id); -} -// Moves the show off the screen so it can't be seen -DllExport void Stop(int id) -{ - DEBUG("Stop:\n"); - MoveWindow(pptviewobj[id].hWnd, -32000, -32000, - pptviewobj[id].rect.right - pptviewobj[id].rect.left, - pptviewobj[id].rect.bottom - pptviewobj[id].rect.top, TRUE); -} - -// Return the total number of slides -DllExport int GetSlideCount(int id) -{ - DEBUG("GetSlideCount:\n"); - if(pptviewobj[id].state==0) - return -1; - else - return pptviewobj[id].slideCount; -} - -// Return the number of the slide currently viewing -DllExport int GetCurrentSlide(int id) -{ - DEBUG("GetCurrentSlide:\n"); - if(pptviewobj[id].state==0) - return -1; - else - return pptviewobj[id].currentSlide; -} - -// Take a step forwards through the show -DllExport void NextStep(int id) -{ - DEBUG("NextStep:\n"); - if(pptviewobj[id].currentSlide>pptviewobj[id].slideCount) - return; - PostMessage(pptviewobj[id].hWnd2, WM_MOUSEWHEEL, MAKEWPARAM(0, -WHEEL_DELTA), 0); -} - -// Take a step backwards through the show -DllExport void PrevStep(int id) -{ - DEBUG("PrevStep:\n"); - PostMessage(pptviewobj[id].hWnd2, WM_MOUSEWHEEL, MAKEWPARAM(0, WHEEL_DELTA), 0); -} - -// Blank the show (black screen) -DllExport void Blank(int id) -{ - // B just toggles blank on/off. However pressing any key unblanks. - // So send random unmapped letter first (say 'A'), then we can - // better guarantee B will blank instead of trying to guess - // whether it was already blank or not. - DEBUG("Blank:\n"); - HWND h1 = GetForegroundWindow(); - HWND h2 = GetFocus(); - SetForegroundWindow(pptviewobj[id].hWnd); - SetFocus(pptviewobj[id].hWnd); - Sleep(50); // slight pause, otherwise event triggering this call may grab focus back! - keybd_event((int)'A', 0, 0, 0); - keybd_event((int)'A', 0, KEYEVENTF_KEYUP, 0); - keybd_event((int)'B', 0, 0, 0); - keybd_event((int)'B', 0, KEYEVENTF_KEYUP, 0); - SetForegroundWindow(h1); - SetFocus(h2); - //PostMessage(pptviewobj[id].hWnd2, WM_KEYDOWN, 'B', 0x00300001); - //PostMessage(pptviewobj[id].hWnd2, WM_CHAR, 'b', 0x00300001); - //PostMessage(pptviewobj[id].hWnd2, WM_KEYUP, 'B', 0xC0300001); -} -// Unblank the show -DllExport void Unblank(int id) -{ - DEBUG("Unblank:\n"); - // Pressing any key resumes. - // For some reason SendMessage works for unblanking, but not blanking. -// SendMessage(pptviewobj[id].hWnd2, WM_KEYDOWN, 'A', 0); - SendMessage(pptviewobj[id].hWnd2, WM_CHAR, 'A', 0); -// SendMessage(pptviewobj[id].hWnd2, WM_KEYUP, 'A', 0); -// HWND h1 = GetForegroundWindow(); -// HWND h2 = GetFocus(); -// Sleep(50); // slight pause, otherwise event triggering this call may grab focus back! -// SetForegroundWindow(pptviewobj[id].hWnd); -// SetFocus(pptviewobj[id].hWnd); -// keybd_event((int)'A', 0, 0, 0); -// SetForegroundWindow(h1); -// SetFocus(h2); -} - -// Go directly to a slide -DllExport void GotoSlide(int id, int slideno) -{ - DEBUG("GotoSlide %i:\n", slideno); - // Did try WM_KEYDOWN/WM_CHAR/WM_KEYUP with SendMessage but didn't work - // perhaps I was sending to the wrong window? No idea. - // Anyway fall back to keybd_event, which is OK as long we makesure - // the slideshow has focus first - char ch[10]; - - if(slideno<0) return; - _itoa_s(slideno, ch, 10, 10); - HWND h1 = GetForegroundWindow(); - HWND h2 = GetFocus(); - SetForegroundWindow(pptviewobj[id].hWnd); - SetFocus(pptviewobj[id].hWnd); - Sleep(50); // slight pause, otherwise event triggering this call may grab focus back! - for(int i=0;i<10;i++) - { - if(ch[i]=='\0') break; - keybd_event((BYTE)ch[i], 0, 0, 0); - keybd_event((BYTE)ch[i], 0, KEYEVENTF_KEYUP, 0); - } - keybd_event(VK_RETURN, 0, 0, 0); - keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0); - SetForegroundWindow(h1); - SetFocus(h2); - - //for(int i=0;i<10;i++) - //{ - // if(ch[i]=='\0') break; - // SendMessage(pptviewobj[id].hWnd2, WM_KEYDOWN, ch[i], 0); - // SendMessage(pptviewobj[id].hWnd2, WM_CHAR, ch[i], 0); - // SendMessage(pptviewobj[id].hWnd2, WM_KEYUP, ch[i], 0); - //} - //SendMessage(pptviewobj[id].hWnd2, WM_KEYDOWN, VK_RETURN, 0); - //SendMessage(pptviewobj[id].hWnd2, WM_CHAR, VK_RETURN, 0); - //SendMessage(pptviewobj[id].hWnd2, WM_KEYUP, VK_RETURN, 0); - //keybd_event(VK_RETURN, 0, 0, 0); -} - -// Restart the show from the beginning -DllExport void RestartShow(int id) -{ - // If we just go direct to slide one, then it remembers that all other slides have - // been animated, so ends up just showing the completed slides of those slides that - // have been animated next time we advance. - // Only way I've found to get around this is to step backwards all the way through. - // Lets move the window out of the way first so the audience doesn't see this. - DEBUG("RestartShow:\n"); - Stop(id); - GotoSlide(id, pptviewobj[id].slideCount); - while(pptviewobj[id].currentSlide>1) - { - PrevStep(id); - Sleep(10); - } - for(int i=0;i<=pptviewobj[id].firstSlideSteps;i++) - { - PrevStep(id); - Sleep(10); - } - Resume(id); -} - -// This hook is started with the PPTVIEW.EXE process and waits for the -// WM_CREATEWND message. At this point (and only this point) can the -// window be resized to the correct size. -// Release the hook as soon as we're complete to free up resources -LRESULT CALLBACK CbtProc(int nCode, WPARAM wParam, LPARAM lParam) -{ - HHOOK hook = globalhook; - if(nCode==HCBT_CREATEWND) - { - char csClassName[16]; - HWND hCurrWnd = (HWND)wParam; - DWORD retProcId = NULL; - GetClassName(hCurrWnd, csClassName, sizeof(csClassName)); - if((strcmp(csClassName, "paneClassDC")==0) - ||(strcmp(csClassName, "screenClass")==0)) - { - int id=-1; - DWORD windowthread = GetWindowThreadProcessId(hCurrWnd,NULL); - for(int i=0; i=0) - { - if(strcmp(csClassName, "paneClassDC")==0) - pptviewobj[id].hWnd2=hCurrWnd; - else - { - pptviewobj[id].hWnd=hCurrWnd; - CBT_CREATEWND* cw = (CBT_CREATEWND*)lParam; - if(pptviewobj[id].hParentWnd!=NULL) - cw->lpcs->hwndParent = pptviewobj[id].hParentWnd; - cw->lpcs->cy=(pptviewobj[id].rect.bottom-pptviewobj[id].rect.top); - cw->lpcs->cx=(pptviewobj[id].rect.right-pptviewobj[id].rect.left); - cw->lpcs->y=-32000; - cw->lpcs->x=-32000; - } - if((pptviewobj[id].hWnd!=NULL)&&(pptviewobj[id].hWnd2!=NULL)) - { - UnhookWindowsHookEx(globalhook); - globalhook=NULL; - pptviewobj[id].hook = SetWindowsHookEx(WH_CALLWNDPROC,CwpProc,hInstance,pptviewobj[id].dwThreadId); - pptviewobj[id].mhook = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,hInstance,pptviewobj[id].dwThreadId); - Sleep(10); - pptviewobj[id].state = PPT_OPENED; - } - } - } - } - return CallNextHookEx(hook,nCode,wParam,lParam); -} - -// This hook exists whilst the slideshow is loading but only listens on the -// slideshows thread. It listens out for mousewheel events -LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) -{ - HHOOK hook = NULL; - MSG *pMSG = (MSG *)lParam; - DWORD windowthread = GetWindowThreadProcessId(pMSG->hwnd,NULL); - int id=-1; - for(int i=0; i=0&&nCode==HC_ACTION&&wParam==PM_REMOVE&&pMSG->message==WM_MOUSEWHEEL) - { - if(pptviewobj[id].state!=PPT_LOADED) - { - if(pptviewobj[id].currentSlide==1) - pptviewobj[id].firstSlideSteps++; - pptviewobj[id].steps++; - } - } - return CallNextHookEx(hook, nCode, wParam, lParam); -} -// This hook exists whilst the slideshow is running but only listens on the -// slideshows thread. It listens out for slide changes, message WM_USER+22. -LRESULT CALLBACK CwpProc(int nCode, WPARAM wParam, LPARAM lParam){ - CWPSTRUCT *cwp; - cwp = (CWPSTRUCT *)lParam; - HHOOK hook = NULL; - char filename[MAX_PATH]; - - DWORD windowthread = GetWindowThreadProcessId(cwp->hwnd,NULL); - int id=-1; - for(int i=0; i=0)&&(nCode==HC_ACTION)) - { - if(cwp->message==WM_USER+22) - { - if(pptviewobj[id].state != PPT_LOADED) - { - if((pptviewobj[id].currentSlide>0) - && (pptviewobj[id].previewpath!=NULL&&strlen(pptviewobj[id].previewpath)>0)) - { - sprintf_s(filename, MAX_PATH, "%s%i.bmp", pptviewobj[id].previewpath, pptviewobj[id].currentSlide); - CaptureAndSaveWindow(cwp->hwnd, filename); - } - } - if(cwp->wParam==0) - { - if(pptviewobj[id].currentSlide>0) - { - pptviewobj[id].state = PPT_LOADED; - pptviewobj[id].currentSlide = pptviewobj[id].slideCount+1; - } - } - else - { - pptviewobj[id].currentSlide = cwp->wParam - 255; - if(pptviewobj[id].currentSlide>pptviewobj[id].slideCount) - pptviewobj[id].slideCount = pptviewobj[id].currentSlide; - } - } - if((pptviewobj[id].state != PPT_CLOSED)&&(cwp->message==WM_CLOSE||cwp->message==WM_QUIT)) - ClosePPT(id); - } - return CallNextHookEx(hook,nCode,wParam,lParam); -} - -VOID CaptureAndSaveWindow(HWND hWnd, CHAR* filename) -{ - HBITMAP hBmp; - if ((hBmp = CaptureWindow(hWnd)) == NULL) - return; - - RECT client; - GetClientRect (hWnd, &client); - UINT uiBytesPerRow = 3 * client.right; // RGB takes 24 bits - UINT uiRemainderForPadding; - - if ((uiRemainderForPadding = uiBytesPerRow % sizeof (DWORD)) > 0) - uiBytesPerRow += (sizeof (DWORD) - uiRemainderForPadding); - - UINT uiBytesPerAllRows = uiBytesPerRow * client.bottom; - PBYTE pDataBits; - - if ((pDataBits = new BYTE [uiBytesPerAllRows]) != NULL) - { - BITMAPINFOHEADER bmi = {0}; - BITMAPFILEHEADER bmf = {0}; - - // Prepare to get the data out of HBITMAP: - bmi.biSize = sizeof (bmi); - bmi.biPlanes = 1; - bmi.biBitCount = 24; - bmi.biHeight = client.bottom; - bmi.biWidth = client.right; - - // Get it: - HDC hDC = GetDC (hWnd); - GetDIBits (hDC, hBmp, 0, client.bottom, pDataBits, - (BITMAPINFO*) &bmi, DIB_RGB_COLORS); - ReleaseDC (hWnd, hDC); - - // Fill the file header: - bmf.bfOffBits = sizeof (bmf) + sizeof (bmi); - bmf.bfSize = bmf.bfOffBits + uiBytesPerAllRows; - bmf.bfType = 0x4D42; - - // Writing: - FILE* pFile; - int err = fopen_s(&pFile, filename, "wb"); - if (err == 0) - { - fwrite (&bmf, sizeof (bmf), 1, pFile); - fwrite (&bmi, sizeof (bmi), 1, pFile); - fwrite (pDataBits, sizeof (BYTE), uiBytesPerAllRows, pFile); - fclose (pFile); - } - delete [] pDataBits; - } - DeleteObject (hBmp); -} -HBITMAP CaptureWindow (HWND hWnd) { - HDC hDC; - BOOL bOk = FALSE; - HBITMAP hImage = NULL; - - hDC = GetDC (hWnd); - RECT rcClient; - GetClientRect (hWnd, &rcClient); - if ((hImage = CreateCompatibleBitmap (hDC, rcClient.right, rcClient.bottom)) != NULL) - { - HDC hMemDC; - HBITMAP hDCBmp; - - if ((hMemDC = CreateCompatibleDC (hDC)) != NULL) - { - hDCBmp = (HBITMAP) SelectObject (hMemDC, hImage); - HMODULE hLib = LoadLibrary("User32"); - // PrintWindow works for windows outside displayable area - // but was only introduced in WinXP. BitBlt requires the window to be topmost - // and within the viewable area of the display - if(GetProcAddress(hLib, "PrintWindow")==NULL) - { - SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE); - BitBlt (hMemDC, 0, 0, rcClient.right, rcClient.bottom, hDC, 0, 0, SRCCOPY); - SetWindowPos(hWnd, HWND_NOTOPMOST, -32000, -32000, 0, 0, SWP_NOSIZE); - } - else - { - PrintWindow(hWnd, hMemDC, 0); - } - SelectObject (hMemDC, hDCBmp); - DeleteDC (hMemDC); - bOk = TRUE; - } - } - ReleaseDC (hWnd, hDC); - if (! bOk) - { - if (hImage) - { - DeleteObject (hImage); - hImage = NULL; - } - } - return hImage; -} diff --git a/openlp/libraries/pptviewlib/pptviewlib.dll b/openlp/libraries/pptviewlib/pptviewlib.dll deleted file mode 100644 index d5505fdaafaca4fe300fddacf1da929a70011cc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80896 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 diff --git a/openlp/libraries/pptviewlib/pptviewlib.h b/openlp/libraries/pptviewlib/pptviewlib.h deleted file mode 100644 index ce011b8eb..000000000 --- a/openlp/libraries/pptviewlib/pptviewlib.h +++ /dev/null @@ -1,54 +0,0 @@ - -#define DllExport extern "C" __declspec( dllexport ) - -enum PPTVIEWSTATE { PPT_CLOSED, PPT_STARTED, PPT_OPENED, PPT_LOADED}; - -DllExport int OpenPPT(char *filename, HWND hParentWnd, RECT rect, char *previewpath); -DllExport void ClosePPT(int id); -DllExport int GetCurrentSlide(int id); -DllExport int GetSlideCount(int id); -DllExport void NextStep(int id); -DllExport void PrevStep(int id); -DllExport void GotoSlide(int id, int slideno); -DllExport void RestartShow(int id); -DllExport void Blank(int id); -DllExport void Unblank(int id); -DllExport void Stop(int id); -DllExport void Resume(int id); -DllExport void SetDebug(BOOL onoff); - -LRESULT CALLBACK CbtProc(int nCode, WPARAM wParam, LPARAM lParam); -LRESULT CALLBACK CwpProc(int nCode, WPARAM wParam, LPARAM lParam); -LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam); -BOOL GetPPTViewerPath(char *pptviewerpath, int strsize); -HBITMAP CaptureWindow (HWND hWnd); -VOID SaveBitmap (CHAR* filename, HBITMAP hBmp) ; -VOID CaptureAndSaveWindow(HWND hWnd, CHAR* filename); -BOOL GetPPTInfo(int id); -BOOL SavePPTInfo(int id); - - -void Unhook(int id); - -#define MAX_PPTOBJS 50 - -struct PPTVIEWOBJ -{ - HHOOK hook; - HHOOK mhook; - HWND hWnd; - HWND hWnd2; - HWND hParentWnd; - HANDLE hProcess; - HANDLE hThread; - DWORD dwProcessId; - DWORD dwThreadId; - RECT rect; - int slideCount; - int currentSlide; - int firstSlideSteps; - int steps; - char filename[MAX_PATH]; - char previewpath[MAX_PATH]; - PPTVIEWSTATE state; -}; \ No newline at end of file diff --git a/openlp/libraries/pptviewlib/pptviewlib.vcproj b/openlp/libraries/pptviewlib/pptviewlib.vcproj deleted file mode 100644 index 13a9e4282..000000000 --- a/openlp/libraries/pptviewlib/pptviewlib.vcproj +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openlp/libraries/pptviewlib/test.ppt b/openlp/libraries/pptviewlib/test.ppt deleted file mode 100644 index 1d90168b16898c8c783c9ac77361fc66ebd84a57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21504 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 OST%36)inr*p7=l6mS+