113ac6606SAndrew Rist /**************************************************************
213ac6606SAndrew Rist *
313ac6606SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
413ac6606SAndrew Rist * or more contributor license agreements. See the NOTICE file
513ac6606SAndrew Rist * distributed with this work for additional information
613ac6606SAndrew Rist * regarding copyright ownership. The ASF licenses this file
713ac6606SAndrew Rist * to you under the Apache License, Version 2.0 (the
813ac6606SAndrew Rist * "License"); you may not use this file except in compliance
913ac6606SAndrew Rist * with the License. You may obtain a copy of the License at
1013ac6606SAndrew Rist *
1113ac6606SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
1213ac6606SAndrew Rist *
1313ac6606SAndrew Rist * Unless required by applicable law or agreed to in writing,
1413ac6606SAndrew Rist * software distributed under the License is distributed on an
1513ac6606SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1613ac6606SAndrew Rist * KIND, either express or implied. See the License for the
1713ac6606SAndrew Rist * specific language governing permissions and limitations
1813ac6606SAndrew Rist * under the License.
1913ac6606SAndrew Rist *
2013ac6606SAndrew Rist *************************************************************/
2113ac6606SAndrew Rist
22cdf0e10cSrcweir // QuickStart.cpp : Defines the entry point for the application.
23cdf0e10cSrcweir //
24cdf0e10cSrcweir
25cdf0e10cSrcweir #include "stdafx.h"
26cdf0e10cSrcweir #include "resource.h"
27cdf0e10cSrcweir #include <systools/win32/uwinapi.h>
28cdf0e10cSrcweir #include <stdio.h>
29cdf0e10cSrcweir
30cdf0e10cSrcweir #define MY_TASKBAR_NOTIFICATION WM_USER+1
31cdf0e10cSrcweir
32cdf0e10cSrcweir #define MAX_LOADSTRING 100
33cdf0e10cSrcweir
34cdf0e10cSrcweir // message used to communicate with soffice
35cdf0e10cSrcweir #define TERMINATIONVETO_MESSAGE "SO TerminationVeto"
36cdf0e10cSrcweir #define TERMINATE_MESSAGE "SO Terminate"
37cdf0e10cSrcweir #define LISTENER_WINDOWCLASS "SO Listener Class"
38cdf0e10cSrcweir #define KILLTRAY_MESSAGE "SO KillTray"
39cdf0e10cSrcweir
40cdf0e10cSrcweir static UINT aTerminationVetoMessage = 0x7FFF;
41cdf0e10cSrcweir static UINT aTerminateMessage = 0x7FFF;
42cdf0e10cSrcweir static HMENU popupMenu = NULL;
43cdf0e10cSrcweir static bool bTerminateVeto = true;
44cdf0e10cSrcweir
45cdf0e10cSrcweir #define UPDATE_TIMER 1
46cdf0e10cSrcweir
47cdf0e10cSrcweir // Global Variables:
48cdf0e10cSrcweir HINSTANCE hInst; // current instance
49cdf0e10cSrcweir TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
50cdf0e10cSrcweir TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text
51cdf0e10cSrcweir
52cdf0e10cSrcweir TCHAR szExitString[MAX_LOADSTRING];
53cdf0e10cSrcweir TCHAR szTooltipString[MAX_LOADSTRING];
54cdf0e10cSrcweir
55*07a3d7f1SPedro Giffuni // Forward declarations of functions included in this code module:
56cdf0e10cSrcweir ATOM MyRegisterClass(HINSTANCE hInstance);
57cdf0e10cSrcweir BOOL InitInstance(HINSTANCE, int);
58cdf0e10cSrcweir LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
59cdf0e10cSrcweir LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
60cdf0e10cSrcweir
SofficeRuns()61cdf0e10cSrcweir bool SofficeRuns()
62cdf0e10cSrcweir {
63cdf0e10cSrcweir // check for soffice by searching the communication window
64cdf0e10cSrcweir return ( FindWindowEx( NULL, NULL, LISTENER_WINDOWCLASS, NULL ) == NULL ) ? false : true;
65cdf0e10cSrcweir }
66cdf0e10cSrcweir
launchSoffice()67cdf0e10cSrcweir bool launchSoffice( )
68cdf0e10cSrcweir {
69cdf0e10cSrcweir if ( !SofficeRuns() )
70cdf0e10cSrcweir {
71cdf0e10cSrcweir // UINT ret = WinExec( "h:\\office60.630b\\program\\swriter.exe -bean", SW_SHOW );
72cdf0e10cSrcweir char filename[_MAX_PATH + 1];
73cdf0e10cSrcweir
74cdf0e10cSrcweir filename[_MAX_PATH] = 0;
75cdf0e10cSrcweir GetModuleFileName( NULL, filename, _MAX_PATH ); // soffice resides in the same dir
76cdf0e10cSrcweir char *p = strrchr( filename, '\\' );
77cdf0e10cSrcweir if ( !p )
78cdf0e10cSrcweir return false;
79cdf0e10cSrcweir
80cdf0e10cSrcweir strncpy( p+1, "soffice.exe", _MAX_PATH - (p+1 - filename) );
81cdf0e10cSrcweir
82cdf0e10cSrcweir char imagename[_MAX_PATH + 1];
83cdf0e10cSrcweir
84cdf0e10cSrcweir imagename[_MAX_PATH] = 0;
85cdf0e10cSrcweir _snprintf(imagename, _MAX_PATH, "\"%s\" -quickstart", filename );
86cdf0e10cSrcweir
87cdf0e10cSrcweir UINT ret = WinExec( imagename, SW_SHOW );
88cdf0e10cSrcweir if ( ret < 32 )
89cdf0e10cSrcweir return false;
90cdf0e10cSrcweir /*
91cdf0e10cSrcweir // wait until we can communicate
92cdf0e10cSrcweir int retry = 30;
93cdf0e10cSrcweir while (retry-- && !SofficeRuns() )
94cdf0e10cSrcweir Sleep(1000);
95cdf0e10cSrcweir
96cdf0e10cSrcweir return SofficeRuns();
97cdf0e10cSrcweir */
98cdf0e10cSrcweir return true;
99cdf0e10cSrcweir }
100cdf0e10cSrcweir else
101cdf0e10cSrcweir return true;
102cdf0e10cSrcweir }
103cdf0e10cSrcweir
NotifyListener(HWND hWnd)104cdf0e10cSrcweir void NotifyListener( HWND hWnd )
105cdf0e10cSrcweir {
106cdf0e10cSrcweir static HICON hIconActive=NULL;
107cdf0e10cSrcweir //static HICON hIconInActive=NULL;
108cdf0e10cSrcweir
109cdf0e10cSrcweir if( !hIconActive )
110cdf0e10cSrcweir {
111cdf0e10cSrcweir hIconActive = (HICON)LoadImage( GetModuleHandle( NULL ), MAKEINTRESOURCE( ICON_ACTIVE ),
112cdf0e10cSrcweir IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ),
113cdf0e10cSrcweir LR_DEFAULTCOLOR | LR_SHARED );
114cdf0e10cSrcweir
115cdf0e10cSrcweir /* hIconInActive = (HICON)LoadImage( GetModuleHandle( NULL ), MAKEINTRESOURCE( ICON_INACTIVE ),
116cdf0e10cSrcweir IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ),
117cdf0e10cSrcweir LR_DEFAULTCOLOR | LR_SHARED );
118cdf0e10cSrcweir */
119cdf0e10cSrcweir }
120cdf0e10cSrcweir
121cdf0e10cSrcweir NOTIFYICONDATA nid;
122cdf0e10cSrcweir nid.cbSize = sizeof(NOTIFYICONDATA);
123cdf0e10cSrcweir nid.hWnd = hWnd;
124cdf0e10cSrcweir nid.uID = IDM_QUICKSTART;
125cdf0e10cSrcweir nid.szTip[elementsof(nid.szTip) - 1] = 0;
126cdf0e10cSrcweir // nid.hIcon = bTerminateVeto ? hIconActive : hIconInActive;
127cdf0e10cSrcweir // strncpy(nid.szTip, bTerminateVeto ? STRING_QUICKSTARTACTIVE : STRING_QUICKSTARTINACTIVE, elementsof(nid.szTip) - 1 );
128cdf0e10cSrcweir nid.hIcon = hIconActive;
129cdf0e10cSrcweir strncpy(nid.szTip, szTooltipString, elementsof(nid.szTip) - 1);
130cdf0e10cSrcweir nid.uFlags = NIF_TIP|NIF_ICON;
131cdf0e10cSrcweir
132cdf0e10cSrcweir // update systray
133cdf0e10cSrcweir Shell_NotifyIcon( NIM_MODIFY, &nid );
134cdf0e10cSrcweir //CheckMenuItem( popupMenu, IDM_QUICKSTART, bTerminateVeto ? MF_CHECKED : MF_UNCHECKED );
135cdf0e10cSrcweir
136cdf0e10cSrcweir // notify listener
137cdf0e10cSrcweir SendMessage( HWND_BROADCAST, aTerminationVetoMessage, (WORD) bTerminateVeto, 0L );
138cdf0e10cSrcweir }
139cdf0e10cSrcweir
140cdf0e10cSrcweir
141cdf0e10cSrcweir
WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR,int nCmdShow)142cdf0e10cSrcweir int APIENTRY WinMain(HINSTANCE hInstance,
143cdf0e10cSrcweir HINSTANCE /*hPrevInstance*/,
144cdf0e10cSrcweir LPSTR /*lpCmdLine*/,
145cdf0e10cSrcweir int nCmdShow)
146cdf0e10cSrcweir {
147cdf0e10cSrcweir // Look for -killtray argument
148cdf0e10cSrcweir
149cdf0e10cSrcweir for ( int i = 1; i < __argc; i++ )
150cdf0e10cSrcweir {
151cdf0e10cSrcweir if ( 0 == strcmp( __argv[i], "-killtray" ) )
152cdf0e10cSrcweir {
153cdf0e10cSrcweir HWND hwndTray = FindWindow( LISTENER_WINDOWCLASS, NULL );
154cdf0e10cSrcweir
155cdf0e10cSrcweir if ( hwndTray )
156cdf0e10cSrcweir {
157cdf0e10cSrcweir UINT uMsgKillTray = RegisterWindowMessage( KILLTRAY_MESSAGE );
158cdf0e10cSrcweir SendMessage( hwndTray, uMsgKillTray, 0, 0 );
159cdf0e10cSrcweir }
160cdf0e10cSrcweir
161cdf0e10cSrcweir return 0;
162cdf0e10cSrcweir }
163cdf0e10cSrcweir }
164cdf0e10cSrcweir
165cdf0e10cSrcweir launchSoffice();
166cdf0e10cSrcweir return 0;
167cdf0e10cSrcweir
168cdf0e10cSrcweir // TODO: Place code here.
169cdf0e10cSrcweir MSG msg;
170cdf0e10cSrcweir HACCEL hAccelTable;
171cdf0e10cSrcweir aTerminationVetoMessage = RegisterWindowMessage( TERMINATIONVETO_MESSAGE );
172cdf0e10cSrcweir aTerminateMessage = RegisterWindowMessage( TERMINATE_MESSAGE );
173cdf0e10cSrcweir
174cdf0e10cSrcweir // Initialize global strings
175cdf0e10cSrcweir LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
176cdf0e10cSrcweir LoadString(hInstance, IDC_QUICKSTART, szWindowClass, MAX_LOADSTRING);
177cdf0e10cSrcweir
178cdf0e10cSrcweir LoadString(hInstance, IDS_EXIT, szExitString, MAX_LOADSTRING);
179cdf0e10cSrcweir LoadString(hInstance, IDS_TOOLTIP, szTooltipString, MAX_LOADSTRING);
180cdf0e10cSrcweir
181cdf0e10cSrcweir MyRegisterClass(hInstance);
182cdf0e10cSrcweir
183cdf0e10cSrcweir // Perform application initialization:
184cdf0e10cSrcweir if (!InitInstance (hInstance, nCmdShow))
185cdf0e10cSrcweir {
186cdf0e10cSrcweir return FALSE;
187cdf0e10cSrcweir }
188cdf0e10cSrcweir
189cdf0e10cSrcweir hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_QUICKSTART);
190cdf0e10cSrcweir
191cdf0e10cSrcweir // Main message loop:
192cdf0e10cSrcweir while (GetMessage(&msg, NULL, 0, 0))
193cdf0e10cSrcweir {
194cdf0e10cSrcweir if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
195cdf0e10cSrcweir {
196cdf0e10cSrcweir TranslateMessage(&msg);
197cdf0e10cSrcweir DispatchMessage(&msg);
198cdf0e10cSrcweir }
199cdf0e10cSrcweir }
200cdf0e10cSrcweir
201cdf0e10cSrcweir return msg.wParam;
202cdf0e10cSrcweir }
203cdf0e10cSrcweir
204cdf0e10cSrcweir
205cdf0e10cSrcweir
206cdf0e10cSrcweir //
207cdf0e10cSrcweir // FUNCTION: MyRegisterClass()
208cdf0e10cSrcweir //
209cdf0e10cSrcweir // PURPOSE: Registers the window class.
210cdf0e10cSrcweir //
211cdf0e10cSrcweir // COMMENTS:
212cdf0e10cSrcweir //
213cdf0e10cSrcweir // This function and its usage is only necessary if you want this code
214cdf0e10cSrcweir // to be compatible with Win32 systems prior to the 'RegisterClassEx'
215cdf0e10cSrcweir // function that was added to Windows 95. It is important to call this function
216cdf0e10cSrcweir // so that the application will get 'well formed' small icons associated
217cdf0e10cSrcweir // with it.
218cdf0e10cSrcweir //
MyRegisterClass(HINSTANCE hInstance)219cdf0e10cSrcweir ATOM MyRegisterClass(HINSTANCE hInstance)
220cdf0e10cSrcweir {
221cdf0e10cSrcweir WNDCLASSEX wcex;
222cdf0e10cSrcweir
223cdf0e10cSrcweir wcex.cbSize = sizeof(WNDCLASSEX);
224cdf0e10cSrcweir
225cdf0e10cSrcweir wcex.style = CS_HREDRAW | CS_VREDRAW;
226cdf0e10cSrcweir wcex.lpfnWndProc = (WNDPROC)WndProc;
227cdf0e10cSrcweir wcex.cbClsExtra = 0;
228cdf0e10cSrcweir wcex.cbWndExtra = 0;
229cdf0e10cSrcweir wcex.hInstance = hInstance;
230cdf0e10cSrcweir wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_QUICKSTART);
231cdf0e10cSrcweir wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
232cdf0e10cSrcweir wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
233cdf0e10cSrcweir wcex.lpszMenuName = NULL;
234cdf0e10cSrcweir wcex.lpszClassName = szWindowClass;
235cdf0e10cSrcweir wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
236cdf0e10cSrcweir
237cdf0e10cSrcweir return RegisterClassEx(&wcex);
238cdf0e10cSrcweir }
239cdf0e10cSrcweir
240cdf0e10cSrcweir //
241cdf0e10cSrcweir // FUNCTION: InitInstance(HANDLE, int)
242cdf0e10cSrcweir //
243cdf0e10cSrcweir // PURPOSE: Saves instance handle and creates main window
244cdf0e10cSrcweir //
245cdf0e10cSrcweir // COMMENTS:
246cdf0e10cSrcweir //
247cdf0e10cSrcweir // In this function, we save the instance handle in a global variable and
248cdf0e10cSrcweir // create and display the main program window.
249cdf0e10cSrcweir //
InitInstance(HINSTANCE hInstance,int nCmdShow)250cdf0e10cSrcweir BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
251cdf0e10cSrcweir {
252cdf0e10cSrcweir HWND hWnd;
253cdf0e10cSrcweir
254cdf0e10cSrcweir hInst = hInstance; // Store instance handle in our global variable
255cdf0e10cSrcweir
256cdf0e10cSrcweir hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
257cdf0e10cSrcweir CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
258cdf0e10cSrcweir
259cdf0e10cSrcweir if (!hWnd)
260cdf0e10cSrcweir {
261cdf0e10cSrcweir return FALSE;
262cdf0e10cSrcweir }
263cdf0e10cSrcweir
264cdf0e10cSrcweir nCmdShow = SW_HIDE; // hide main window, we only need the taskbar icon
265cdf0e10cSrcweir ShowWindow(hWnd, nCmdShow);
266cdf0e10cSrcweir UpdateWindow(hWnd);
267cdf0e10cSrcweir
268cdf0e10cSrcweir return TRUE;
269cdf0e10cSrcweir }
270cdf0e10cSrcweir
271cdf0e10cSrcweir //
272cdf0e10cSrcweir // FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
273cdf0e10cSrcweir //
274cdf0e10cSrcweir // PURPOSE: Processes messages for the main window.
275cdf0e10cSrcweir //
276cdf0e10cSrcweir // WM_COMMAND - process the application menu
277cdf0e10cSrcweir // WM_PAINT - Paint the main window
278cdf0e10cSrcweir // WM_DESTROY - post a quit message and return
279cdf0e10cSrcweir //
280cdf0e10cSrcweir //
WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)281cdf0e10cSrcweir LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
282cdf0e10cSrcweir {
283cdf0e10cSrcweir switch (message)
284cdf0e10cSrcweir {
285cdf0e10cSrcweir case WM_CREATE:
286cdf0e10cSrcweir {
287cdf0e10cSrcweir // make sure soffice runs
288cdf0e10cSrcweir if( !launchSoffice() )
289cdf0e10cSrcweir return -1;
290cdf0e10cSrcweir
291cdf0e10cSrcweir // create popup menu
292cdf0e10cSrcweir popupMenu = CreatePopupMenu();
293cdf0e10cSrcweir static int count=0;
294cdf0e10cSrcweir
295cdf0e10cSrcweir // Add my items
296cdf0e10cSrcweir MENUITEMINFO mi;
297cdf0e10cSrcweir mi.cbSize = sizeof(MENUITEMINFO);
298cdf0e10cSrcweir mi.fMask=MIIM_TYPE|MIIM_STATE|MIIM_ID;
299cdf0e10cSrcweir mi.fType=MFT_STRING;
300cdf0e10cSrcweir mi.fState=MFS_ENABLED|MFS_DEFAULT;
301cdf0e10cSrcweir mi.wID = IDM_QUICKSTART;
302cdf0e10cSrcweir mi.hSubMenu=NULL;
303cdf0e10cSrcweir mi.hbmpChecked=NULL;
304cdf0e10cSrcweir mi.hbmpUnchecked=NULL;
305cdf0e10cSrcweir mi.dwItemData=NULL;
306cdf0e10cSrcweir mi.dwTypeData = "QuickStart";
307cdf0e10cSrcweir mi.cch = strlen(mi.dwTypeData);
308cdf0e10cSrcweir // InsertMenuItem(popupMenu, count++, TRUE, &mi);
309cdf0e10cSrcweir
310cdf0e10cSrcweir mi.cbSize = sizeof(MENUITEMINFO);
311cdf0e10cSrcweir mi.fMask=MIIM_TYPE|MIIM_STATE|MIIM_ID;
312cdf0e10cSrcweir mi.fType=MFT_STRING;
313cdf0e10cSrcweir mi.fState=MFS_ENABLED;
314cdf0e10cSrcweir mi.wID = IDM_ABOUT;
315cdf0e10cSrcweir mi.hSubMenu=NULL;
316cdf0e10cSrcweir mi.hbmpChecked=NULL;
317cdf0e10cSrcweir mi.hbmpUnchecked=NULL;
318cdf0e10cSrcweir mi.dwItemData=NULL;
319cdf0e10cSrcweir mi.dwTypeData = "Info...";
320cdf0e10cSrcweir mi.cch = strlen(mi.dwTypeData);
321cdf0e10cSrcweir // InsertMenuItem(popupMenu, count++, TRUE, &mi);
322cdf0e10cSrcweir
323cdf0e10cSrcweir mi.cbSize = sizeof(MENUITEMINFO);
324cdf0e10cSrcweir mi.fMask=MIIM_TYPE;
325cdf0e10cSrcweir mi.fType=MFT_SEPARATOR;
326cdf0e10cSrcweir mi.hSubMenu=NULL;
327cdf0e10cSrcweir mi.hbmpChecked=NULL;
328cdf0e10cSrcweir mi.hbmpUnchecked=NULL;
329cdf0e10cSrcweir mi.dwItemData=NULL;
330cdf0e10cSrcweir // InsertMenuItem(popupMenu, count++, TRUE, &mi);
331cdf0e10cSrcweir
332cdf0e10cSrcweir mi.cbSize = sizeof(MENUITEMINFO);
333cdf0e10cSrcweir mi.fMask=MIIM_TYPE|MIIM_STATE|MIIM_ID;
334cdf0e10cSrcweir mi.fType=MFT_STRING;
335cdf0e10cSrcweir mi.fState=MFS_ENABLED;
336cdf0e10cSrcweir mi.wID = IDM_EXIT;
337cdf0e10cSrcweir mi.hSubMenu=NULL;
338cdf0e10cSrcweir mi.hbmpChecked=NULL;
339cdf0e10cSrcweir mi.hbmpUnchecked=NULL;
340cdf0e10cSrcweir mi.dwItemData=NULL;
341cdf0e10cSrcweir mi.dwTypeData = szExitString;
342cdf0e10cSrcweir mi.cch = strlen(mi.dwTypeData);
343cdf0e10cSrcweir InsertMenuItem(popupMenu, count++, TRUE, &mi);
344cdf0e10cSrcweir
345cdf0e10cSrcweir // add taskbar icon
346cdf0e10cSrcweir NOTIFYICONDATA nid;
347cdf0e10cSrcweir nid.cbSize = sizeof(NOTIFYICONDATA);
348cdf0e10cSrcweir nid.hWnd = hWnd;
349cdf0e10cSrcweir nid.uID = IDM_QUICKSTART;
350cdf0e10cSrcweir nid.uFlags = NIF_MESSAGE;
351cdf0e10cSrcweir nid.uCallbackMessage=MY_TASKBAR_NOTIFICATION;
352cdf0e10cSrcweir Shell_NotifyIcon(NIM_ADD, &nid);
353cdf0e10cSrcweir
354cdf0e10cSrcweir // and update state
355cdf0e10cSrcweir NotifyListener( hWnd );
356cdf0e10cSrcweir
357cdf0e10cSrcweir // check for soffice
358cdf0e10cSrcweir SetTimer(hWnd, UPDATE_TIMER, 3000, NULL);
359cdf0e10cSrcweir }
360cdf0e10cSrcweir break;
361cdf0e10cSrcweir
362cdf0e10cSrcweir case MY_TASKBAR_NOTIFICATION: // message from taskbar
363cdf0e10cSrcweir switch(lParam)
364cdf0e10cSrcweir {
365cdf0e10cSrcweir /*
366cdf0e10cSrcweir case WM_LBUTTONDBLCLK:
367cdf0e10cSrcweir bTerminateVeto = bTerminateVeto ? false : true;
368cdf0e10cSrcweir NotifyListener( hWnd );
369cdf0e10cSrcweir break;
370cdf0e10cSrcweir */
371cdf0e10cSrcweir
372cdf0e10cSrcweir case WM_LBUTTONDOWN:
373cdf0e10cSrcweir case WM_RBUTTONDOWN:
374cdf0e10cSrcweir {
375cdf0e10cSrcweir POINT pt;
376cdf0e10cSrcweir GetCursorPos(&pt);
377cdf0e10cSrcweir SetForegroundWindow( hWnd );
378cdf0e10cSrcweir int m = TrackPopupMenuEx(popupMenu, TPM_RETURNCMD|TPM_LEFTALIGN|TPM_RIGHTBUTTON,
379cdf0e10cSrcweir pt.x, pt.y, hWnd, NULL);
380cdf0e10cSrcweir // BUGFIX: See Q135788 (PRB: Menus for Notification Icons Don't Work Correctly)
381cdf0e10cSrcweir PostMessage(hWnd, NULL, 0, 0);
382cdf0e10cSrcweir switch(m)
383cdf0e10cSrcweir {
384cdf0e10cSrcweir case IDM_QUICKSTART:
385cdf0e10cSrcweir bTerminateVeto = bTerminateVeto ? false : true;
386cdf0e10cSrcweir NotifyListener( hWnd );
387cdf0e10cSrcweir break;
388cdf0e10cSrcweir case IDM_ABOUT:
389cdf0e10cSrcweir DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
390cdf0e10cSrcweir break;
391cdf0e10cSrcweir case IDM_EXIT:
392cdf0e10cSrcweir DestroyWindow(hWnd);
393cdf0e10cSrcweir break;
394cdf0e10cSrcweir }
395cdf0e10cSrcweir }
396cdf0e10cSrcweir break;
397cdf0e10cSrcweir }
398cdf0e10cSrcweir break;
399cdf0e10cSrcweir
400cdf0e10cSrcweir case WM_TIMER:
401cdf0e10cSrcweir if( wParam == UPDATE_TIMER )
402cdf0e10cSrcweir {
403cdf0e10cSrcweir // update state
404cdf0e10cSrcweir NotifyListener( hWnd );
405cdf0e10cSrcweir }
406cdf0e10cSrcweir break;
407cdf0e10cSrcweir
408cdf0e10cSrcweir case WM_DESTROY:
409cdf0e10cSrcweir // try to terminate office
410cdf0e10cSrcweir SendMessage( HWND_BROADCAST, aTerminateMessage, 0, 0L );
411cdf0e10cSrcweir
412cdf0e10cSrcweir // delete taskbar icon
413cdf0e10cSrcweir NOTIFYICONDATA nid;
414cdf0e10cSrcweir nid.cbSize=sizeof(NOTIFYICONDATA);
415cdf0e10cSrcweir nid.hWnd = hWnd;
416cdf0e10cSrcweir nid.uID = IDM_QUICKSTART;
417cdf0e10cSrcweir Shell_NotifyIcon(NIM_DELETE, &nid);
418cdf0e10cSrcweir
419cdf0e10cSrcweir PostQuitMessage(0);
420cdf0e10cSrcweir break;
421cdf0e10cSrcweir default:
422cdf0e10cSrcweir return DefWindowProc(hWnd, message, wParam, lParam);
423cdf0e10cSrcweir }
424cdf0e10cSrcweir return 0;
425cdf0e10cSrcweir }
426cdf0e10cSrcweir
427cdf0e10cSrcweir // Mesage handler for about box.
About(HWND hDlg,UINT message,WPARAM wParam,LPARAM)428cdf0e10cSrcweir LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM)
429cdf0e10cSrcweir {
430cdf0e10cSrcweir switch (message)
431cdf0e10cSrcweir {
432cdf0e10cSrcweir case WM_INITDIALOG:
433cdf0e10cSrcweir return TRUE;
434cdf0e10cSrcweir
435cdf0e10cSrcweir case WM_COMMAND:
436cdf0e10cSrcweir if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
437cdf0e10cSrcweir {
438cdf0e10cSrcweir EndDialog(hDlg, LOWORD(wParam));
439cdf0e10cSrcweir return TRUE;
440cdf0e10cSrcweir }
441cdf0e10cSrcweir break;
442cdf0e10cSrcweir }
443cdf0e10cSrcweir return FALSE;
444cdf0e10cSrcweir }
445