From d81d037f2b1d3e1840aa9384d5d253ac2e53d9b0 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Wed, 12 Nov 2008 23:24:41 +0000 Subject: [PATCH] Attempt to fix a few PPTVIEWLIB timing issues bzr-revno: 87 --- openlp/libraries/pptviewlib/pptviewlib.cpp | 132 ++++++++++++++++----- openlp/libraries/pptviewlib/pptviewlib.dll | Bin 78336 -> 80896 bytes openlp/libraries/pptviewlib/pptviewlib.h | 3 + 3 files changed, 107 insertions(+), 28 deletions(-) diff --git a/openlp/libraries/pptviewlib/pptviewlib.cpp b/openlp/libraries/pptviewlib/pptviewlib.cpp index 0848d2baf..5e2f81d72 100644 --- a/openlp/libraries/pptviewlib/pptviewlib.cpp +++ b/openlp/libraries/pptviewlib/pptviewlib.cpp @@ -70,9 +70,9 @@ BOOL APIENTRY DllMain( HMODULE hModule, } DllExport void SetDebug(BOOL onoff) { - printf("SetDebug"); + printf("SetDebug\n"); debug = onoff; - DEBUG("enabled"); + DEBUG("enabled\n"); } // Open the PointPoint, count the slides and take a snapshot of each slide @@ -169,27 +169,48 @@ DllExport int OpenPPT(char *filename, HWND hParentWnd, RECT rect, char *previewp 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) { - NextStep(id); - Sleep(100); // need to be careful not to be too quick, otherwise step to far and close show + 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); } - //InvalidateRect(pptviewobj[id].hWnd, NULL, TRUE); + 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; @@ -203,7 +224,11 @@ BOOL GetPPTInfo(int id) 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)) { @@ -218,6 +243,8 @@ BOOL GetPPTInfo(int id) } 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++) { @@ -225,7 +252,9 @@ BOOL GetPPTInfo(int id) 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; } @@ -249,8 +278,11 @@ BOOL SavePPTInfo(int id) DEBUG("SavePPTInfo: fopen of %s failed%i\n", info, err); return FALSE; } - DEBUG("%u\n%u\n%u\n", filestats.st_mtime, filestats.st_size, pptviewobj[id].slideCount); - fprintf(pFile, "%u\n%u\n%u\n", filestats.st_mtime, filestats.st_size, pptviewobj[id].slideCount); + 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; @@ -283,7 +315,10 @@ 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"); } @@ -345,14 +380,16 @@ DllExport int GetCurrentSlide(int id) DllExport void NextStep(int id) { DEBUG("NextStep:\n"); - PostMessage(pptviewobj[id].hWnd, WM_MOUSEWHEEL, MAKEWPARAM(0, -WHEEL_DELTA), 0); + 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].hWnd, WM_MOUSEWHEEL, MAKEWPARAM(0, WHEEL_DELTA), 0); + PostMessage(pptviewobj[id].hWnd2, WM_MOUSEWHEEL, MAKEWPARAM(0, WHEEL_DELTA), 0); } // Blank the show (black screen) @@ -365,29 +402,31 @@ DllExport void Blank(int id) DEBUG("Blank:\n"); HWND h1 = GetForegroundWindow(); HWND h2 = GetFocus(); - SetForegroundWindow(pptviewobj[id].hWnd2); - SetFocus(pptviewobj[id].hWnd2); + 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); - //SendMessage(pptviewobj[id].hWnd2, WM_KEYDOWN, 'A', 0); - //SendMessage(pptviewobj[id].hWnd2, WM_CHAR, 'A', 0); - //SendMessage(pptviewobj[id].hWnd2, WM_KEYUP, 'A', 0); - //SendMessage(pptviewobj[id].hWnd2, WM_KEYDOWN, 'B', 0); - //SendMessage(pptviewobj[id].hWnd2, WM_CHAR, 'B', 0); - //SendMessage(pptviewobj[id].hWnd2, WM_KEYUP, 'B', 0); + //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. - SendMessage(pptviewobj[id].hWnd2, WM_KEYDOWN, 'A', 0); + // 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); +// 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); @@ -411,12 +450,15 @@ DllExport void GotoSlide(int id, int slideno) 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); @@ -452,6 +494,7 @@ DllExport void RestartShow(int id) for(int i=0;i<=pptviewobj[id].firstSlideSteps;i++) { PrevStep(id); + Sleep(10); } Resume(id); } @@ -501,8 +544,10 @@ LRESULT CALLBACK CbtProc(int nCode, WPARAM wParam, LPARAM lParam) { UnhookWindowsHookEx(globalhook); globalhook=NULL; - pptviewobj[id].state = PPT_OPENED; 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; } } } @@ -510,6 +555,34 @@ LRESULT CALLBACK CbtProc(int nCode, WPARAM wParam, LPARAM lParam) 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){ @@ -533,12 +606,14 @@ LRESULT CALLBACK CwpProc(int nCode, WPARAM wParam, LPARAM lParam){ { if(cwp->message==WM_USER+22) { - if((pptviewobj[id].state != PPT_LOADED) - && (pptviewobj[id].currentSlide>0) - && (pptviewobj[id].previewpath!=NULL&&strlen(pptviewobj[id].previewpath)>0)) + if(pptviewobj[id].state != PPT_LOADED) { - sprintf_s(filename, MAX_PATH, "%s%i.bmp", pptviewobj[id].previewpath, pptviewobj[id].currentSlide); - CaptureAndSaveWindow(cwp->hwnd, filename); + 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) { @@ -550,8 +625,6 @@ LRESULT CALLBACK CwpProc(int nCode, WPARAM wParam, LPARAM lParam){ } else { - if((pptviewobj[id].state != PPT_LOADED)&&cwp->wParam==256) - pptviewobj[id].firstSlideSteps++; pptviewobj[id].currentSlide = cwp->wParam - 255; if(pptviewobj[id].currentSlide>pptviewobj[id].slideCount) pptviewobj[id].slideCount = pptviewobj[id].currentSlide; @@ -634,6 +707,9 @@ HBITMAP CaptureWindow (HWND hWnd) { { 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); diff --git a/openlp/libraries/pptviewlib/pptviewlib.dll b/openlp/libraries/pptviewlib/pptviewlib.dll index 8ebd58fc39422b1b58ea2e6d76582b517b3ac649..d5505fdaafaca4fe300fddacf1da929a70011cc3 100644 GIT binary patch delta 15313 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 delta 13971 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 diff --git a/openlp/libraries/pptviewlib/pptviewlib.h b/openlp/libraries/pptviewlib/pptviewlib.h index 67415a95c..ce011b8eb 100644 --- a/openlp/libraries/pptviewlib/pptviewlib.h +++ b/openlp/libraries/pptviewlib/pptviewlib.h @@ -19,6 +19,7 @@ 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) ; @@ -34,6 +35,7 @@ void Unhook(int id); struct PPTVIEWOBJ { HHOOK hook; + HHOOK mhook; HWND hWnd; HWND hWnd2; HWND hParentWnd; @@ -45,6 +47,7 @@ struct PPTVIEWOBJ int slideCount; int currentSlide; int firstSlideSteps; + int steps; char filename[MAX_PATH]; char previewpath[MAX_PATH]; PPTVIEWSTATE state;