// shelltray.cpp // // Copyright 2000 Microsoft Corporation, all rights reserved // // Created 2-00 - anbrad // #include "main.h" #include "shelltray.h" #include "resource.h" #include "netwatch.h" #include "dsubmit.h" void OpenContextMenu(HWND hwnd, POINT * pPoint); void OnTaskBarIconRButtonUp(HWND hwnd); //---------------------------------------------------------------------------- // AddTrayIcon // void AddTrayIcon( HWND hwnd) { NOTIFYICONDATA nid; HICON hiconTray = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_FACE)); if (hiconTray) { nid.uID = 0; nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hwnd; nid.uCallbackMessage = WM_USER_TRAYCALLBACK; nid.hIcon = hiconTray; nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; lstrcpy(nid.szTip, TEXT("Double click to save your network trace.")); } g_fTrayPresent = Shell_NotifyIcon(NIM_ADD, &nid); } //---------------------------------------------------------------------------- // RemoveTrayIcon // void RemoveTrayIcon( HWND hwnd) { NOTIFYICONDATA nid; if (g_fTrayPresent) { nid.uID = 0; nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hwnd; nid.uCallbackMessage = WM_USER_TRAYCALLBACK; nid.uFlags = 0; } g_fTrayPresent = !(Shell_NotifyIcon(NIM_DELETE, &nid)); } //---------------------------------------------------------------------------- // UpdateTrayIcon // void UpdateTrayIcon( HWND hwnd) { NOTIFYICONDATA nid; if (g_fTrayPresent) { nid.uID = 0; nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hwnd; nid.uCallbackMessage = WM_USER_TRAYCALLBACK; nid.uFlags = NIF_TIP; _tcscpy(nid.szTip, TEXT("Double click to save your network trace.")); } Shell_NotifyIcon(NIM_MODIFY, &nid); } //---------------------------------------------------------------------------- // ProcessTrayCallback // void ProcessTrayCallback( HWND hwnd, WPARAM wParam, LPARAM lParam) { UINT uID = (UINT) wParam; UINT uMouseMsg = (UINT) lParam; static bInDialog; switch(uMouseMsg) { case WM_LBUTTONDBLCLK: if (!bInDialog) { bInDialog = TRUE; StopCapture(); if (IDOK == DialogBox( g_hInst, MAKEINTRESOURCE(IDD_SUBMIT), NULL, DlgProcSubmit)) { SaveCapture(); } else { RestartCapture(); } bInDialog = FALSE; } break; case WM_RBUTTONUP: OnTaskBarIconRButtonUp(hwnd); break; } } void OnTaskBarIconRButtonUp(HWND hwnd) { POINT pt; GetCursorPos(&pt); OpenContextMenu(hwnd, &pt); } #if (WINVER > 0x0400) VOID SetIconFocus(HWND hwnd) { NOTIFYICONDATA nid; ZeroMemory (&nid, sizeof(nid)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hwnd; nid.uID = 0; // Shell_NotifyIcon(NIM_SETFOCUS, &nid); } #endif void OpenContextMenu(HWND hwnd, POINT * pPoint) { HRESULT hr = S_OK; INT iCmd = 0; INT iMenu = 0; HMENU hmenu = 0; BOOL fDisconnected = FALSE; INT iIdCustomMin = -1; INT iIdCustomMax = -1; BOOL fBranded = FALSE; // Find the connection info based on the tray icon id. // hmenu = LoadMenu(g_hInst, MAKEINTRESOURCE(POPUP_TRAY)); if (hmenu) { // Get the first menu from the popup. For some reason, this hack is // required instead of tracking on the outside menu // HMENU hmenuTrack = GetSubMenu(hmenu, 0); // Set the default menu item // SetMenuDefaultItem(hmenuTrack, CMIDM_TRAY_CLOSE, FALSE); // Set the owner window to be foreground as a hack so the // popup menu disappears when the user clicks elsewhere. // SetForegroundWindow(hwnd); // Part of the above hack. Bring up the menu and figure out the result iCmd = TrackPopupMenu(hmenuTrack, TPM_RETURNCMD | TPM_NONOTIFY | TPM_RIGHTBUTTON, pPoint->x, pPoint->y, 0, hwnd, NULL); DestroyMenu(hmenu); MSG msgTmp; while (PeekMessage(&msgTmp, hwnd, WM_LBUTTONDOWN, WM_LBUTTONUP, PM_REMOVE)) { DispatchMessage(&msgTmp); } // Process the command // switch (iCmd) { case CMIDM_TRAY_CLOSE: SendMessage(hwnd, WM_DESTROY, 0, 0); break; // Tray menu cancelled without selection // case 0: break; // Unknown command // default: break; } // Shift the focus back to the shell // #if (WINVER > 0x0400) SetIconFocus(hwnd); #endif } }