diff --git a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp index 92b849797..86876a836 100644 --- a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp +++ b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp @@ -27,62 +27,67 @@ #include #include "pptviewlib.h" -// Because of the callbacks used by SetWindowsHookEx, the memory used needs to -// be sharable across processes (callbacks are done from a different process) + +// 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. - +// 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") -PPTVIEW pptviews[MAX_PPTS] = {NULL}; -HHOOK global_hook = NULL; +PPTVIEWOBJ pptviewobj[MAX_PPTOBJS] = {NULL}; +HHOOK globalhook = NULL; BOOL debug = FALSE; #pragma data_seg() #pragma comment(linker, "/SECTION:.PPTVIEWLIB,RWS") -HINSTANCE h_instance = NULL; +#define DEBUG(...) if(debug) printf(__VA_ARGS__) -BOOL APIENTRY DllMain(HMODULE h_module, DWORD ul_reason_for_call, - LPVOID lp_reserved) + +HINSTANCE hInstance = NULL; + +BOOL APIENTRY DllMain( HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) { - h_instance = (HINSTANCE)h_module; + hInstance = (HINSTANCE)hModule; switch (ul_reason_for_call) { - case DLL_PROCESS_ATTACH: - DEBUG("PROCESS_ATTACH\n"); - break; - case DLL_THREAD_ATTACH: - DEBUG("THREAD_ATTACH\n"); - break; - case DLL_THREAD_DETACH: - DEBUG("THREAD_DETACH\n"); - break; - case DLL_PROCESS_DETACH: - // Clean up... hopefully there is only the one process attached? - // We'll find out soon enough during tests! - DEBUG("PROCESS_DETACH\n"); - for(int i = 0; i < MAX_PPTS; i++) - ClosePPT(i); - break; + case DLL_PROCESS_ATTACH: + DEBUG("PROCESS_ATTACH\n"); + break; + case DLL_THREAD_ATTACH: + DEBUG("THREAD_ATTACH\n"); + break; + case DLL_THREAD_DETACH: + DEBUG("THREAD_DETACH\n"); + break; + case DLL_PROCESS_DETACH: + // Clean up... hopefully there is only the one process attached? + // We'll find out soon enough during tests! + DEBUG("PROCESS_DETACH\n"); + 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 h_parent_wnd, RECT rect, - char *preview_path) +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; %s\n", filename, preview_path); - DEBUG("OpenPPT start: %u; %i, %i, %i, %i\n", h_parent_wnd, rect.top, - rect.left, rect.bottom, rect.right); - id = -1; - for(int i = 0; i < MAX_PPTS; i++) + DEBUG("OpenPPT start: %s; %s\n", filename, previewpath); + DEBUG("OpenPPT start: %u; %i, %i, %i, %i\n", hParentWnd, rect.top, rect.left, rect.bottom, rect.right); + if(GetPPTViewerPath(cmdline, sizeof(cmdline))==FALSE) { - if(pptviews[i].state == PPT_CLOSED) + DEBUG("OpenPPT: GetPPTViewerPath failed\n"); + return -1; + } + id = -1; + for(int i = 0; ibottom - wnd_rect->top; - pptviews[id].rect.right = wnd_rect->right - wnd_rect->left; + LPRECT wndrect = NULL; + GetWindowRect(hParentWnd, wndrect); + pptviewobj[id].rect.top = 0; + pptviewobj[id].rect.left = 0; + pptviewobj[id].rect.bottom = wndrect->bottom-wndrect->top; + pptviewobj[id].rect.right = wndrect->right-wndrect->left; } else { - pptviews[id].rect.top = rect.top; - pptviews[id].rect.left = rect.left; - pptviews[id].rect.bottom = rect.bottom; - pptviews[id].rect.right = rect.right; + pptviewobj[id].rect.top = rect.top; + pptviewobj[id].rect.left = rect.left; + pptviewobj[id].rect.bottom = rect.bottom; + pptviewobj[id].rect.right = rect.right; } - BOOL got_info = GetPPTInfo(id); - return got_info; -} -BOOL StartPPTView(int id) -{ + strcat_s(cmdline, MAX_PATH * 2, "/F /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); /* * 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 @@ -218,48 +164,69 @@ BOOL StartPPTView(int id) * * hook = SetWindowsHookEx(WH_CBT,CbtProc,hInstance,pi.dwThreadId); */ - DEBUG("StartPPTView\n"); - STARTUPINFO si; - PROCESS_INFORMATION pi; - char cmd_line[MAX_PATH * 2]; - - if(global_hook != NULL) - UnhookWindowsHookEx(global_hook); - global_hook = SetWindowsHookEx(WH_CBT, CbtProc, h_instance, NULL); - if(global_hook == 0) + if(globalhook!=NULL) + UnhookWindowsHookEx(globalhook); + globalhook = SetWindowsHookEx(WH_CBT,CbtProc,hInstance,NULL); + if(globalhook==0) { DEBUG("OpenPPT: SetWindowsHookEx failed\n"); ClosePPT(id); - return FALSE; + return -1; } - if(GetPPTViewerPath(cmd_line, sizeof(cmd_line)) == FALSE) - { - DEBUG("OpenPPT: GetPPTViewerPath failed\n"); - return FALSE; - } - pptviews[id].state = PPT_STARTED; + pptviewobj[id].state = PPT_STARTED; Sleep(10); - strcat_s(cmd_line, MAX_PATH * 2, "/F /S \""); - strcat_s(cmd_line, MAX_PATH * 2, pptviews[id].filename); - strcat_s(cmd_line, MAX_PATH * 2, "\""); - memset(&si, 0, sizeof(si)); - memset(&pi, 0, sizeof(pi)); - DEBUG("Command: %s\n", cmd_line); - if(!CreateProcess(NULL, cmd_line, NULL, NULL, FALSE, 0, 0, NULL, &si, &pi)) + if(!CreateProcess(NULL, cmdline, NULL, NULL, FALSE, 0, 0, NULL, &si, &pi)) { DEBUG("OpenPPT: CreateProcess failed\n"); ClosePPT(id); - return FALSE; + return -1; } - pptviews[id].dw_process_id = pi.dwProcessId; - pptviews[id].dw_thread_id = pi.dwThreadId; - pptviews[id].h_thread = pi.hThread; - pptviews[id].h_process = pi.hProcess; - while(pptviews[id].state == PPT_STARTED) + pptviewobj[id].dwProcessId = pi.dwProcessId; + pptviewobj[id].dwThreadId = pi.dwThreadId; + pptviewobj[id].hThread = pi.hThread; + pptviewobj[id].hProcess = pi.hProcess; + while(pptviewobj[id].state==PPT_STARTED) Sleep(10); - return TRUE; + if(gotinfo) + { + DEBUG("OpenPPT: Info loaded, no refresh\n"); + pptviewobj[id].state = PPT_LOADED; + Resume(id); + } + else + { + DEBUG("OpenPPT: Get info\n"); + pptviewobj[id].steps = 0; + int steps = 0; + while(pptviewobj[id].state==PPT_OPENED) + { + if(steps<=pptviewobj[id].steps) + { + Sleep(20); + 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); + if(pptviewobj[id].state==PPT_CLOSING||pptviewobj[id].slideCount<=0){ + ClosePPT(id); + id=-1; + } + else + RestartShow(id); + } + if(id>=0) + { + 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 @@ -269,115 +236,100 @@ BOOL StartPPTView(int id) // first slide steps BOOL GetPPTInfo(int id) { - struct _stat file_stats; + struct _stat filestats; char info[MAX_PATH]; - FILE* p_file; + FILE* pFile; char buf[100]; DEBUG("GetPPTInfo: start\n"); - if(_stat(pptviews[id].filename, &file_stats) != 0) + if(_stat(pptviewobj[id].filename, &filestats)!=0) return FALSE; - sprintf_s(info, MAX_PATH, "%sinfo.txt", pptviews[id].preview_path); - int err = fopen_s(&p_file, info, "r"); - if(err != 0) + 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, p_file); // version == 1 - fgets(buf, 100, p_file); - if(file_stats.st_mtime != atoi(buf)) + fgets(buf, 100, pFile); // version == 1 + fgets(buf, 100, pFile); + if(filestats.st_mtime!=atoi(buf)) { - fclose (p_file); + fclose (pFile); return FALSE; } - fgets(buf, 100, p_file); - if(file_stats.st_size != atoi(buf)) + fgets(buf, 100, pFile); + if(filestats.st_size!=atoi(buf)) { - fclose(p_file); + fclose (pFile); return FALSE; } - fgets(buf, 100, p_file); // slidecount - int slide_count = atoi(buf); - fgets(buf, 100, p_file); // first slide steps - int first_slide_steps = atoi(buf); + 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 <= slide_count; i++) + for(int i = 1; i<=slidecount; i++) { - sprintf_s(info, MAX_PATH, "%s%i.bmp", - pptviews[id].preview_path, i); - if(GetFileAttributes(info) == INVALID_FILE_ATTRIBUTES) + sprintf_s(info, MAX_PATH, "%s%i.bmp", pptviewobj[id].previewpath, i); + if(GetFileAttributes(info)==INVALID_FILE_ATTRIBUTES) return FALSE; } - fclose(p_file); - pptviews[id].slide_count = slide_count; - pptviews[id].first_slide_steps = first_slide_steps; + fclose(pFile); + pptviewobj[id].slideCount = slidecount; + pptviewobj[id].firstSlideSteps = firstslidesteps; DEBUG("GetPPTInfo: exit ok\n"); return TRUE; } BOOL SavePPTInfo(int id) { - struct _stat file_stats; + struct _stat filestats; char info[MAX_PATH]; - FILE* p_file; + FILE* pFile; DEBUG("SavePPTInfo: start\n"); - if(_stat(pptviews[id].filename, &file_stats) != 0) + if(_stat(pptviewobj[id].filename, &filestats)!=0) { - DEBUG("SavePPTInfo: stat of %s failed\n", pptviews[id].filename); + DEBUG("SavePPTInfo: stat of %s failed\n", pptviewobj[id].filename); return FALSE; } - sprintf_s(info, MAX_PATH, "%sinfo.txt", pptviews[id].preview_path); - int err = fopen_s(&p_file, info, "w"); - if(err != 0) + 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; } - else - { - DEBUG("SavePPTInfo: fopen of %s succeeded\n", info); - } - fprintf(p_file, "1\n"); - fprintf(p_file, "%u\n", file_stats.st_mtime); - fprintf(p_file, "%u\n", file_stats.st_size); - fprintf(p_file, "%u\n", pptviews[id].slide_count); - fprintf(p_file, "%u\n", pptviews[id].first_slide_steps); - fclose(p_file); + 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 *pptviewer_path, int str_size) +BOOL GetPPTViewerPath(char *pptviewerpath, int strsize) { - HKEY h_key; - DWORD dw_type, dw_size; - LRESULT l_result; + HKEY hkey; + DWORD dwtype, dwsize; + LRESULT lresult; DEBUG("GetPPTViewerPath: start\n"); - if((RegOpenKeyEx(HKEY_CLASSES_ROOT, - "PowerPointViewer.Show.12\\shell\\Show\\command", - 0, KEY_READ, &h_key) != ERROR_SUCCESS) - && (RegOpenKeyEx(HKEY_CLASSES_ROOT, - "Applications\\PPTVIEW.EXE\\shell\\open\\command", - 0, KEY_READ, &h_key) != ERROR_SUCCESS) - && (RegOpenKeyEx(HKEY_CLASSES_ROOT, - "Applications\\PPTVIEW.EXE\\shell\\Show\\command", - 0, KEY_READ, &h_key) != ERROR_SUCCESS)) - { - return FALSE; - } - dw_type = REG_SZ; - dw_size = (DWORD)str_size; - l_result = RegQueryValueEx(h_key, NULL, NULL, &dw_type, - (LPBYTE)pptviewer_path, &dw_size); - RegCloseKey(h_key); - if(l_result != ERROR_SUCCESS) + if(RegOpenKeyEx(HKEY_CLASSES_ROOT, "PowerPointViewer.Show.12\\shell\\Show\\command", 0, KEY_READ, &hkey)!=ERROR_SUCCESS) + if(RegOpenKeyEx(HKEY_CLASSES_ROOT, "Applications\\PPTVIEW.EXE\\shell\\open\\command", 0, KEY_READ, &hkey)!=ERROR_SUCCESS) + if(RegOpenKeyEx(HKEY_CLASSES_ROOT, "Applications\\PPTVIEW.EXE\\shell\\Show\\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; - // remove "%1" from the end of the key value - pptviewer_path[strlen(pptviewer_path) - 4] = '\0'; + pptviewerpath[strlen(pptviewerpath)-4] = '\0'; // remove "%1" from end of key value DEBUG("GetPPTViewerPath: exit ok\n"); return TRUE; } @@ -386,12 +338,12 @@ BOOL GetPPTViewerPath(char *pptviewer_path, int str_size) void Unhook(int id) { DEBUG("Unhook: start %d\n", id); - if(pptviews[id].hook != NULL) - UnhookWindowsHookEx(pptviews[id].hook); - if(pptviews[id].mhook != NULL) - UnhookWindowsHookEx(pptviews[id].mhook); - pptviews[id].hook = NULL; - pptviews[id].mhook = NULL; + 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"); } @@ -399,15 +351,15 @@ void Unhook(int id) DllExport void ClosePPT(int id) { DEBUG("ClosePPT: start%d\n", id); - pptviews[id].state = PPT_CLOSED; + pptviewobj[id].state = PPT_CLOSED; Unhook(id); - if(pptviews[id].h_wnd == 0) - TerminateThread(pptviews[id].h_thread, 0); + if(pptviewobj[id].hWnd==0) + TerminateThread(pptviewobj[id].hThread, 0); else - PostMessage(pptviews[id].h_wnd, WM_CLOSE, 0, 0); - CloseHandle(pptviews[id].h_thread); - CloseHandle(pptviews[id].h_process); - memset(&pptviews[id], 0, sizeof(pptviews)); + 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; } @@ -415,60 +367,54 @@ DllExport void ClosePPT(int id) DllExport void Resume(int id) { DEBUG("Resume: %d\n", id); - MoveWindow(pptviews[id].h_wnd, pptviews[id].rect.left, - pptviews[id].rect.top, - pptviews[id].rect.right - pptviews[id].rect.left, - pptviews[id].rect.bottom - pptviews[id].rect.top, TRUE); + 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:%d\n", id); - MoveWindow(pptviews[id].h_wnd, -32000, -32000, - pptviews[id].rect.right - pptviews[id].rect.left, - pptviews[id].rect.bottom - pptviews[id].rect.top, TRUE); + 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:%d\n", id); - if(pptviews[id].state == 0) + if(pptviewobj[id].state==0) return -1; else - return pptviews[id].slide_count; + return pptviewobj[id].slideCount; } // Return the number of the slide currently viewing DllExport int GetCurrentSlide(int id) { DEBUG("GetCurrentSlide:%d\n", id); - if(pptviews[id].state == 0) + if(pptviewobj[id].state==0) return -1; else - return pptviews[id].current_slide; + return pptviewobj[id].currentSlide; } // Take a step forwards through the show DllExport void NextStep(int id) { - DEBUG("NextStep:%d (%d)\n", id, pptviews[id].current_slide); - if(pptviews[id].current_slide > pptviews[id].slide_count) + DEBUG("NextStep:%d\n", id); + if(pptviewobj[id].currentSlide>pptviewobj[id].slideCount) return; - pptviews[id].guess = pptviews[id].current_slide + 1; - PostMessage(pptviews[id].h_wnd_input, WM_MOUSEWHEEL, - MAKEWPARAM(0, -WHEEL_DELTA), 0); + 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:%d (%d)\n", id, pptviews[id].current_slide); - if(pptviews[id].current_slide > 1) - pptviews[id].guess = pptviews[id].current_slide - 1; - PostMessage(pptviews[id].h_wnd_input, WM_MOUSEWHEEL, - MAKEWPARAM(0, WHEEL_DELTA), 0); + DEBUG("PrevStep:%d\n", id); + PostMessage(pptviewobj[id].hWnd2, WM_MOUSEWHEEL, MAKEWPARAM(0, WHEEL_DELTA), 0); } // Blank the show (black screen) @@ -481,22 +427,18 @@ DllExport void Blank(int id) DEBUG("Blank:%d\n", id); HWND h1 = GetForegroundWindow(); HWND h2 = GetFocus(); - SetForegroundWindow(pptviews[id].h_wnd); - SetFocus(pptviews[id].h_wnd); - // slight pause, otherwise event triggering this call may grab focus back! - Sleep(50); + 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); - - // This is the preferred method, but didn't work. Keep it here for - // documentation if we revisit in the future - //PostMessage(pptviews[id].h_wnd_input, WM_KEYDOWN, 'B', 0x00300001); - //PostMessage(pptviews[id].h_wnd_input, WM_CHAR, 'b', 0x00300001); - //PostMessage(pptviews[id].h_wnd_input, WM_KEYUP, 'B', 0xC0300001); + //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) @@ -504,47 +446,39 @@ DllExport void Unblank(int id) DEBUG("Unblank:%d\n", id); // Pressing any key resumes. // For some reason SendMessage works for unblanking, but not blanking. - // However keep the commented code for documentation in case we want - // to revisit later. - - //SendMessage(pptviews[id].h_wnd_input, WM_KEYDOWN, 'A', 0); - SendMessage(pptviews[id].h_wnd_input, WM_CHAR, 'A', 0); - //SendMessage(pptviews[id].h_wnd_input, WM_KEYUP, 'A', 0); - //HWND h1 = GetForegroundWindow(); - //HWND h2 = GetFocus(); - ////slight pause, otherwise event triggering this call may grab focus back! - //Sleep(50); - //SetForegroundWindow(pptviews[id].h_wnd); - //SetFocus(pptviews[id].h_wnd); - //keybd_event((int)'A', 0, 0, 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); +// 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 slide_no) +DllExport void GotoSlide(int id, int slideno) { - DEBUG("GotoSlide %i %i:\n", id, slide_no); + DEBUG("GotoSlide %i %i:\n", id, 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(slide_no < 0) - return; - pptviews[id].guess = slide_no; - _itoa_s(slide_no, ch, 10, 10); + if(slideno<0) return; + _itoa_s(slideno, ch, 10, 10); HWND h1 = GetForegroundWindow(); HWND h2 = GetFocus(); - SetForegroundWindow(pptviews[id].h_wnd); - SetFocus(pptviews[id].h_wnd); - // slight pause, otherwise event triggering this call may grab focus back! - Sleep(50); - for(int i = 0; i < 10; i++) + 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; + if(ch[i]=='\0') break; keybd_event((BYTE)ch[i], 0, 0, 0); keybd_event((BYTE)ch[i], 0, KEYEVENTF_KEYUP, 0); } @@ -553,40 +487,36 @@ DllExport void GotoSlide(int id, int slide_no) SetForegroundWindow(h1); SetFocus(h2); - // I don't know why the below didn't work. - // Kept here as documentation in case we want to try again in the future - // //for(int i=0;i<10;i++) //{ // if(ch[i]=='\0') break; - // SendMessage(pptviews[id].h_wnd_input, WM_KEYDOWN, ch[i], 0); - // SendMessage(pptviews[id].h_wnd_input, WM_CHAR, ch[i], 0); - // SendMessage(pptviews[id].h_wnd_input, WM_KEYUP, ch[i], 0); + // 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(pptviews[id].h_wnd_input, WM_KEYDOWN, VK_RETURN, 0); - //SendMessage(pptviews[id].h_wnd_input, WM_CHAR, VK_RETURN, 0); - //SendMessage(pptviews[id].h_wnd_input, WM_KEYUP, VK_RETURN, 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. + // 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:%d\n", id); Stop(id); - GotoSlide(id, pptviews[id].slide_count); - while(pptviews[id].current_slide > 1) + GotoSlide(id, pptviewobj[id].slideCount); + while(pptviewobj[id].currentSlide>1) { PrevStep(id); Sleep(10); } - for(int i = 0; i <= pptviews[id].first_slide_steps; i++) + for(int i=0;i<=pptviewobj[id].firstSlideSteps;i++) { PrevStep(id); Sleep(10); @@ -598,293 +528,236 @@ DllExport void RestartShow(int id) // 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 n_code, WPARAM w_param, LPARAM l_param) +LRESULT CALLBACK CbtProc(int nCode, WPARAM wParam, LPARAM lParam) { - HHOOK hook = global_hook; - if(n_code == HCBT_CREATEWND) + HHOOK hook = globalhook; + if(nCode==HCBT_CREATEWND) { - char cs_class_name[16]; - HWND h_curr_wnd = (HWND)w_param; - DWORD ret_proc_id = NULL; - GetClassName(h_curr_wnd, cs_class_name, sizeof(cs_class_name)); - if((strcmp(cs_class_name, "paneClassDC") == 0) - ||(strcmp(cs_class_name, "screenClass") == 0)) + 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 window_thread = GetWindowThreadProcessId(h_curr_wnd,NULL); - for(int i = 0; i < MAX_PPTS; i++) + int id=-1; + DWORD windowthread = GetWindowThreadProcessId(hCurrWnd,NULL); + for(int i=0; i= 0) + if(id>=0) { - if(strcmp(cs_class_name, "paneClassDC") == 0) - pptviews[id].h_wnd_input = h_curr_wnd; + if(strcmp(csClassName, "paneClassDC")==0) + pptviewobj[id].hWnd2=hCurrWnd; else { - pptviews[id].h_wnd = h_curr_wnd; - CBT_CREATEWND* cw = (CBT_CREATEWND*)l_param; - if(pptviews[id].h_parent_wnd != NULL) - cw->lpcs->hwndParent = pptviews[id].h_parent_wnd; - cw->lpcs->cy = pptviews[id].rect.bottom - - pptviews[id].rect.top; - cw->lpcs->cx = pptviews[id].rect.right - - pptviews[id].rect.left; - cw->lpcs->y = -32000; - cw->lpcs->x = -32000; + 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((pptviews[id].h_wnd != NULL) - && (pptviews[id].h_wnd_input != NULL)) + if((pptviewobj[id].hWnd!=NULL)&&(pptviewobj[id].hWnd2!=NULL)) { - UnhookWindowsHookEx(global_hook); - global_hook = NULL; - pptviews[id].hook = SetWindowsHookEx(WH_CALLWNDPROC, - CwpProc, h_instance, pptviews[id].dw_thread_id); - pptviews[id].mhook = SetWindowsHookEx(WH_GETMESSAGE, - GetMsgProc, h_instance, pptviews[id].dw_thread_id); + 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); - pptviews[id].state = PPT_OPENED; + pptviewobj[id].state = PPT_OPENED; } } } } - return CallNextHookEx(hook, n_code, w_param, l_param); + 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 n_code, WPARAM w_param, LPARAM l_param) +LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) { HHOOK hook = NULL; - MSG *p_msg = (MSG *)l_param; - DWORD window_thread = GetWindowThreadProcessId(p_msg->hwnd, NULL); - int id = -1; - for(int i = 0; i < MAX_PPTS; i++) + MSG *pMSG = (MSG *)lParam; + DWORD windowthread = GetWindowThreadProcessId(pMSG->hwnd,NULL); + int id=-1; + for(int i=0; i= 0 && n_code == HC_ACTION && w_param == PM_REMOVE - && p_msg->message == WM_MOUSEWHEEL) + if(id>=0&&nCode==HC_ACTION&&wParam==PM_REMOVE&&pMSG->message==WM_MOUSEWHEEL) { - if(pptviews[id].state != PPT_LOADED) + if(pptviewobj[id].state!=PPT_LOADED) { - if(pptviews[id].current_slide == 1) - pptviews[id].first_slide_steps++; - pptviews[id].steps++; + if(pptviewobj[id].currentSlide==1) + pptviewobj[id].firstSlideSteps++; + pptviewobj[id].steps++; } } - return CallNextHookEx(hook, n_code, w_param, l_param); + 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 n_code, WPARAM w_param, LPARAM l_param) -{ +LRESULT CALLBACK CwpProc(int nCode, WPARAM wParam, LPARAM lParam){ CWPSTRUCT *cwp; - cwp = (CWPSTRUCT *)l_param; + cwp = (CWPSTRUCT *)lParam; HHOOK hook = NULL; char filename[MAX_PATH]; - DWORD window_thread = GetWindowThreadProcessId(cwp->hwnd, NULL); - int id = -1; - for(int i = 0; i < MAX_PPTS; i++) + DWORD windowthread = GetWindowThreadProcessId(cwp->hwnd,NULL); + int id=-1; + for(int i=0; i= 0) && (n_code == HC_ACTION)) + if((id>=0)&&(nCode==HC_ACTION)) { - if(cwp->message == WM_USER + 22) + if(cwp->message==WM_USER+22) { - if(pptviews[id].state != PPT_LOADED) + if(pptviewobj[id].state != PPT_LOADED) { - if((pptviews[id].current_slide > 0) - && (pptviews[id].preview_path != NULL - && strlen(pptviews[id].preview_path) > 0)) + if((pptviewobj[id].currentSlide>0) + && (pptviewobj[id].previewpath!=NULL&&strlen(pptviewobj[id].previewpath)>0)) { - sprintf_s(filename, MAX_PATH, "%s%i.bmp", - pptviews[id].preview_path, - pptviews[id].current_slide); + sprintf_s(filename, MAX_PATH, "%s%i.bmp", pptviewobj[id].previewpath, pptviewobj[id].currentSlide); CaptureAndSaveWindow(cwp->hwnd, filename); } } - if(cwp->wParam == 0) + if(cwp->wParam==0) { - if(pptviews[id].current_slide > 0) + if(pptviewobj[id].currentSlide>0) { - pptviews[id].state = PPT_LOADED; - pptviews[id].current_slide = pptviews[id].slide_count + 1; + pptviewobj[id].state = PPT_LOADED; + pptviewobj[id].currentSlide = pptviewobj[id].slideCount+1; } } else { - if(pptviews[id].state != PPT_LOADED) - { - if((pptviews[id].current_slide == 0) - ||(pptviews[id].slide_no[pptviews[id].current_slide] - != cwp->wParam)) - { - if(pptviews[id].slide_no[1] == cwp->wParam) - { - pptviews[id].state = PPT_LOADED; - } - else - { - pptviews[id].current_slide++; - pptviews[id].slide_count - = pptviews[id].current_slide; - pptviews[id].slide_no[pptviews[id].current_slide] - = cwp->wParam; - } - } - } - else - { - if(pptviews[id].guess > 0 - && pptviews[id].slide_no[pptviews[id].guess] == 0) - { - pptviews[id].current_slide = 0; - } - for(int i = 1; i < pptviews[id].slide_count; i++) - { - if(pptviews[id].slide_no[i] == cwp->wParam) - { - pptviews[id].current_slide = i; - break; - } - } - if(pptviews[id].current_slide == 0) - { - pptviews[id].slide_no[pptviews[id].guess] = cwp->wParam; - pptviews[id].current_slide = pptviews[id].guess; - } - } + pptviewobj[id].currentSlide = cwp->wParam - 255; + if(pptviewobj[id].currentSlide>pptviewobj[id].slideCount) + pptviewobj[id].slideCount = pptviewobj[id].currentSlide; } } - if((pptviews[id].state != PPT_CLOSED) - && (cwp->message == WM_CLOSE || cwp->message == WM_QUIT)) - { - pptviews[id].state = PPT_CLOSING; - } + if((pptviewobj[id].state != PPT_CLOSED)&&(cwp->message==WM_CLOSE||cwp->message==WM_QUIT)) + pptviewobj[id].state = PPT_CLOSING; } - return CallNextHookEx(hook, n_code, w_param, l_param); + return CallNextHookEx(hook,nCode,wParam,lParam); } -// Take a screenshot of the current slide, and create a .bmp -VOID CaptureAndSaveWindow(HWND h_wnd, CHAR* filename) +VOID CaptureAndSaveWindow(HWND hWnd, CHAR* filename) { - HBITMAP h_bmp; - if ((h_bmp = CaptureWindow(h_wnd)) == NULL) + HBITMAP hBmp; + if ((hBmp = CaptureWindow(hWnd)) == NULL) return; RECT client; - GetClientRect(h_wnd, &client); - UINT ui_bytes_per_row = 3 * client.right; // RGB takes 24 bits - UINT ui_remainder_for_padding; + GetClientRect (hWnd, &client); + UINT uiBytesPerRow = 3 * client.right; // RGB takes 24 bits + UINT uiRemainderForPadding; - if ((ui_remainder_for_padding = ui_bytes_per_row % sizeof (DWORD)) > 0) - ui_bytes_per_row += (sizeof(DWORD) - ui_remainder_for_padding); + if ((uiRemainderForPadding = uiBytesPerRow % sizeof (DWORD)) > 0) + uiBytesPerRow += (sizeof (DWORD) - uiRemainderForPadding); - UINT ui_bytes_per_all_rows = ui_bytes_per_row * client.bottom; - PBYTE p_data_bits; + UINT uiBytesPerAllRows = uiBytesPerRow * client.bottom; + PBYTE pDataBits; - if ((p_data_bits = new BYTE[ui_bytes_per_all_rows]) != NULL) + 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.biSize = sizeof (bmi); bmi.biPlanes = 1; bmi.biBitCount = 24; bmi.biHeight = client.bottom; bmi.biWidth = client.right; // Get it: - HDC h_dc = GetDC(h_wnd); - GetDIBits(h_dc, h_bmp, 0, client.bottom, p_data_bits, - (BITMAPINFO*) &bmi, DIB_RGB_COLORS); - ReleaseDC(h_wnd, h_dc); + 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 + ui_bytes_per_all_rows; + bmf.bfOffBits = sizeof (bmf) + sizeof (bmi); + bmf.bfSize = bmf.bfOffBits + uiBytesPerAllRows; bmf.bfType = 0x4D42; // Writing: - FILE* p_file; - int err = fopen_s(&p_file, filename, "wb"); + FILE* pFile; + int err = fopen_s(&pFile, filename, "wb"); if (err == 0) { - fwrite(&bmf, sizeof(bmf), 1, p_file); - fwrite(&bmi, sizeof(bmi), 1, p_file); - fwrite(p_data_bits, sizeof(BYTE), ui_bytes_per_all_rows, p_file); - fclose(p_file); + fwrite (&bmf, sizeof (bmf), 1, pFile); + fwrite (&bmi, sizeof (bmi), 1, pFile); + fwrite (pDataBits, sizeof (BYTE), uiBytesPerAllRows, pFile); + fclose (pFile); } - delete [] p_data_bits; + delete [] pDataBits; } - DeleteObject(h_bmp); + DeleteObject (hBmp); } -HBITMAP CaptureWindow(HWND h_wnd) -{ - HDC h_dc; - BOOL b_ok = FALSE; - HBITMAP h_image = NULL; +HBITMAP CaptureWindow (HWND hWnd) { + HDC hDC; + BOOL bOk = FALSE; + HBITMAP hImage = NULL; - h_dc = GetDC(h_wnd); - RECT rc_client; - GetClientRect(h_wnd, &rc_client); - if((h_image = CreateCompatibleBitmap(h_dc, rc_client.right, - rc_client.bottom)) != NULL) + hDC = GetDC (hWnd); + RECT rcClient; + GetClientRect (hWnd, &rcClient); + if ((hImage = CreateCompatibleBitmap (hDC, rcClient.right, rcClient.bottom)) != NULL) { - HDC h_mem_dc; - HBITMAP h_dc_bmp; + HDC hMemDC; + HBITMAP hDCBmp; - if((h_mem_dc = CreateCompatibleDC (h_dc)) != NULL) + if ((hMemDC = CreateCompatibleDC (hDC)) != NULL) { - h_dc_bmp = (HBITMAP)SelectObject(h_mem_dc, h_image); - HMODULE h_lib = LoadLibrary("User32"); + 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(h_lib, "PrintWindow") == NULL) + // 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(h_wnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE); - BitBlt (h_mem_dc, 0, 0, rc_client.right, rc_client.bottom, - h_dc, 0, 0, SRCCOPY); - SetWindowPos(h_wnd, HWND_NOTOPMOST, -32000, -32000, 0, 0, - SWP_NOSIZE); + 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(h_wnd, h_mem_dc, 0); + PrintWindow(hWnd, hMemDC, 0); } - SelectObject(h_mem_dc, h_dc_bmp); - DeleteDC(h_mem_dc); - b_ok = TRUE; + SelectObject (hMemDC, hDCBmp); + DeleteDC (hMemDC); + bOk = TRUE; } } - ReleaseDC(h_wnd, h_dc); - if(!b_ok) + ReleaseDC (hWnd, hDC); + if (! bOk) { - if (h_image) + if (hImage) { - DeleteObject(h_image); - h_image = NULL; + DeleteObject (hImage); + hImage = NULL; } } - return h_image; -} \ No newline at end of file + return hImage; +} diff --git a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.dll b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.dll index d7d7c1fba..f8a0de0d3 100644 Binary files a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.dll and b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.dll differ diff --git a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h index 6b98e329b..6012b0467 100644 --- a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h +++ b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h @@ -1,63 +1,55 @@ -#define DllExport extern "C" __declspec(dllexport) -#define DEBUG(...) if(debug) printf(__VA_ARGS__) +#define DllExport extern "C" __declspec( dllexport ) -enum PPTVIEWSTATE {PPT_CLOSED, PPT_STARTED, PPT_OPENED, - PPT_LOADED, PPT_CLOSING}; +enum PPTVIEWSTATE { PPT_CLOSED, PPT_STARTED, PPT_OPENED, PPT_LOADED, PPT_CLOSING}; -DllExport int OpenPPT(char *filename, HWND h_parent_wnd, RECT rect, - char *preview_path); +DllExport int OpenPPT(char *filename, HWND hParentWnd, RECT rect, char *previewpath); DllExport BOOL CheckInstalled(); 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 slide_no); +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 on_off); +DllExport void SetDebug(BOOL onoff); -LRESULT CALLBACK CbtProc(int n_code, WPARAM w_param, LPARAM l_param); -LRESULT CALLBACK CwpProc(int n_code, WPARAM w_param, LPARAM l_param); -LRESULT CALLBACK GetMsgProc(int n_code, WPARAM w_param, LPARAM l_param); -BOOL GetPPTViewerPath(char *pptviewer_path, int str_size); -HBITMAP CaptureWindow (HWND h_wnd); -VOID SaveBitmap (CHAR* filename, HBITMAP h_bmp); -VOID CaptureAndSaveWindow(HWND h_wnd, CHAR* filename); +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); -BOOL InitPPTObject(int id, char *filename, HWND h_parent_wnd, - RECT rect, char *preview_path); -BOOL StartPPTView(int id); + void Unhook(int id); -#define MAX_PPTS 16 -#define MAX_SLIDES 256 +#define MAX_PPTOBJS 50 -struct PPTVIEW +struct PPTVIEWOBJ { HHOOK hook; HHOOK mhook; - HWND h_wnd; // The main pptview window - HWND h_wnd_input; // A child pptview window which takes windows messages - HWND h_parent_wnd; - HANDLE h_process; - HANDLE h_thread; - DWORD dw_process_id; - DWORD dw_thread_id; + HWND hWnd; + HWND hWnd2; + HWND hParentWnd; + HANDLE hProcess; + HANDLE hThread; + DWORD dwProcessId; + DWORD dwThreadId; RECT rect; - int slide_count; - int current_slide; - int first_slide_steps; + int slideCount; + int currentSlide; + int firstSlideSteps; int steps; - int guess; // What the current slide might be, based on the last action char filename[MAX_PATH]; - char preview_path[MAX_PATH]; - int slide_no[MAX_SLIDES]; + char previewpath[MAX_PATH]; PPTVIEWSTATE state; };