1*13ac6606SAndrew Rist /************************************************************** 2*13ac6606SAndrew Rist * 3*13ac6606SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*13ac6606SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*13ac6606SAndrew Rist * distributed with this work for additional information 6*13ac6606SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*13ac6606SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*13ac6606SAndrew Rist * "License"); you may not use this file except in compliance 9*13ac6606SAndrew Rist * with the License. You may obtain a copy of the License at 10*13ac6606SAndrew Rist * 11*13ac6606SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*13ac6606SAndrew Rist * 13*13ac6606SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*13ac6606SAndrew Rist * software distributed under the License is distributed on an 15*13ac6606SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*13ac6606SAndrew Rist * KIND, either express or implied. See the License for the 17*13ac6606SAndrew Rist * specific language governing permissions and limitations 18*13ac6606SAndrew Rist * under the License. 19*13ac6606SAndrew Rist * 20*13ac6606SAndrew Rist *************************************************************/ 21*13ac6606SAndrew 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 55cdf0e10cSrcweir // Foward 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 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 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 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 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 // 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 // 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 // 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. 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