static LRESULT CALLBACK WindowFunc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { /************************************** * * W i n d o w _ F u n c * ************************************** * * Functional description * * This function is where the windowing action takes place. * Handle the various messages which come here from GetMessage. * **************************************/ static BOOL bInTaskBar = FALSE; static bool bStartup = false; static HINSTANCE hInstance = NULL; static UINT s_uTaskbarRestart; hInstance = (HINSTANCE) GetWindowLongPtr(hWnd, GWLP_HINSTANCE); switch (message) { case WM_CLOSE: // Clean up memory for log_entry while (log_entry->next) { log_info* tmp = log_entry->next; free(log_entry); log_entry = tmp; } free(log_entry); DestroyWindow(hWnd); break; case WM_COMMAND: switch (wParam) { case IDM_CANCEL: ShowWindow(hWnd, bInTaskBar ? SW_HIDE : SW_MINIMIZE); return TRUE; case IDM_OPENPOPUP: { // The SetForegroundWindow() has to be called because our window // does not become the Foreground one (inspite of clicking on // the icon). This is so because the icon is painted on the task // bar and is not the same as a minimized window. SetForegroundWindow(hWnd); HMENU hPopup = CreatePopupMenu(); char szMsgString[256]; LoadString(hInstance, IDS_SVRPROPERTIES, szMsgString, 256); AppendMenu(hPopup, MF_STRING, IDM_SVRPROPERTIES, szMsgString); LoadString(hInstance, IDS_SHUTDOWN, szMsgString, 256); AppendMenu(hPopup, MF_STRING, IDM_SHUTDOWN, szMsgString); LoadString(hInstance, IDS_PROPERTIES, szMsgString, 256); AppendMenu(hPopup, MF_STRING, IDM_PROPERTIES, szMsgString); SetMenuDefaultItem(hPopup, IDM_PROPERTIES, FALSE); POINT curPos; GetCursorPos(&curPos); TrackPopupMenu(hPopup, TPM_LEFTALIGN | TPM_RIGHTBUTTON, curPos.x, curPos.y, 0, hWnd, NULL); DestroyMenu(hPopup); return TRUE; } case IDM_SHUTDOWN: { HWND hTmpWnd = FindWindow(szClassName, szWindowName); PostMessage(hTmpWnd, WM_COMMAND, (WPARAM) IDM_SHUTDOWN, 0); } return TRUE; case IDM_PROPERTIES: if (!hPSDlg) hPSDlg = DisplayPropSheet(hWnd, hInstance); else SetForegroundWindow(hPSDlg); return TRUE; case IDM_INTRSVRPROPERTIES: return TRUE; case IDM_SVRPROPERTIES: { HWND hTmpWnd = FindWindow(szClassName, szWindowName); PostMessage(hTmpWnd, WM_COMMAND, (WPARAM) IDM_PROPERTIES, 0); } return TRUE; } break; case WM_SWITCHICONS: nRestarts++; { // scope DWORD thr_exit = 0; if (swap_icons_thd == 0 || !GetExitCodeThread(swap_icons_thd, &thr_exit) || thr_exit != STILL_ACTIVE) { Thread::start(swap_icons, hWnd, THREAD_medium, &swap_icons_thd); } } // scope break; case ON_NOTIFYICON: if (bStartup) { SendMessage(hWnd, WM_COMMAND, 0, 0); return TRUE; } switch (lParam) { case WM_LBUTTONDOWN: break; case WM_LBUTTONDBLCLK: PostMessage(hWnd, WM_COMMAND, (WPARAM) IDM_PROPERTIES, 0); break; case WM_RBUTTONUP: PostMessage(hWnd, WM_COMMAND, (WPARAM) IDM_OPENPOPUP, 0); break; } break; case WM_CREATE: s_uTaskbarRestart = RegisterWindowMessage("TaskbarCreated"); addTaskBarIcons(hInstance, hWnd, bInTaskBar); break; case WM_QUERYOPEN: if (!bInTaskBar) return FALSE; return DefWindowProc(hWnd, message, wParam, lParam); case WM_SYSCOMMAND: if (!bInTaskBar) { switch (wParam) { case SC_RESTORE: return TRUE; case IDM_SHUTDOWN: { HWND hTmpWnd = FindWindow(szClassName, szWindowName); PostMessage(hTmpWnd, WM_COMMAND, (WPARAM) IDM_SHUTDOWN, 0); } return TRUE; case IDM_PROPERTIES: if (!hPSDlg) hPSDlg = DisplayPropSheet(hWnd, hInstance); else SetFocus(hPSDlg); return TRUE; case IDM_SVRPROPERTIES: { HWND hTmpWnd = FindWindow(szClassName, szWindowName); PostMessage(hTmpWnd, WM_COMMAND, (WPARAM) IDM_PROPERTIES, 0); } return TRUE; } } return DefWindowProc(hWnd, message, wParam, lParam); case WM_DESTROY: if (bInTaskBar) { NOTIFYICONDATA nid; nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; nid.uID = IDI_IBGUARD; nid.uFlags = 0; Shell_NotifyIcon(NIM_DELETE, &nid); } PostQuitMessage(0); break; default: if (message == s_uTaskbarRestart) addTaskBarIcons(hInstance, hWnd, bInTaskBar); return DefWindowProc(hWnd, message, wParam, lParam); } return FALSE; }
static LRESULT CALLBACK WindowFunc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { /************************************** * * W i n d o w _ F u n c * ************************************** * * Functional description * * This function is where the windowing action takes place. * Handle the various messages which come here from GetMessage. * **************************************/ static BOOL bInTaskBar = FALSE; static bool bStartup = false; static HINSTANCE hInstance = NULL; hInstance = (HINSTANCE) GetWindowLongPtr(hWnd, GWLP_HINSTANCE); switch (message) { case WM_CLOSE: // Clean up memory for log_entry while (log_entry->next) { log_info* tmp = log_entry->next; free(log_entry); log_entry = tmp; } free(log_entry); DestroyWindow(hWnd); break; case WM_COMMAND: switch (wParam) { case IDM_CANCEL: ShowWindow(hWnd, bInTaskBar ? SW_HIDE : SW_MINIMIZE); return TRUE; case IDM_OPENPOPUP: { // The SetForegroundWindow() has to be called because our window // does not become the Foreground one (inspite of clicking on // the icon). This is so because the icon is painted on the task // bar and is not the same as a minimized window. SetForegroundWindow(hWnd); HMENU hPopup = CreatePopupMenu(); char szMsgString[256]; LoadString(hInstance, IDS_SVRPROPERTIES, szMsgString, 256); AppendMenu(hPopup, MF_STRING, IDM_SVRPROPERTIES, szMsgString); LoadString(hInstance, IDS_SHUTDOWN, szMsgString, 256); AppendMenu(hPopup, MF_STRING, IDM_SHUTDOWN, szMsgString); LoadString(hInstance, IDS_PROPERTIES, szMsgString, 256); AppendMenu(hPopup, MF_STRING, IDM_PROPERTIES, szMsgString); SetMenuDefaultItem(hPopup, IDM_PROPERTIES, FALSE); POINT curPos; GetCursorPos(&curPos); TrackPopupMenu(hPopup, TPM_LEFTALIGN | TPM_RIGHTBUTTON, curPos.x, curPos.y, 0, hWnd, NULL); DestroyMenu(hPopup); return TRUE; } case IDM_SHUTDOWN: { HWND hTmpWnd = FindWindow(szClassName, szWindowName); PostMessage(hTmpWnd, WM_COMMAND, (WPARAM) IDM_SHUTDOWN, 0); } return TRUE; case IDM_PROPERTIES: if (!hPSDlg) hPSDlg = DisplayPropSheet(hWnd, hInstance); else SetForegroundWindow(hPSDlg); return TRUE; case IDM_INTRSVRPROPERTIES: return TRUE; case IDM_SVRPROPERTIES: { HWND hTmpWnd = FindWindow(szClassName, szWindowName); PostMessage(hTmpWnd, WM_COMMAND, (WPARAM) IDM_PROPERTIES, 0); } return TRUE; } break; case WM_SWITCHICONS: nRestarts++; gds__thread_start(swap_icons, hWnd, THREAD_medium, 0, NULL); break; case ON_NOTIFYICON: if (bStartup) { SendMessage(hWnd, WM_COMMAND, 0, 0); return TRUE; } switch (lParam) { case WM_LBUTTONDOWN: break; case WM_LBUTTONDBLCLK: PostMessage(hWnd, WM_COMMAND, (WPARAM) IDM_PROPERTIES, 0); break; case WM_RBUTTONUP: PostMessage(hWnd, WM_COMMAND, (WPARAM) IDM_OPENPOPUP, 0); break; } break; case WM_CREATE: if (!service_flag) { HICON hIcon = (HICON) LoadImage(hInstance, MAKEINTRESOURCE(IDI_IBGUARD), IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR); NOTIFYICONDATA nid; nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; nid.uID = IDI_IBGUARD; nid.uFlags = NIF_TIP | NIF_ICON | NIF_MESSAGE; nid.uCallbackMessage = ON_NOTIFYICON; nid.hIcon = hIcon; lstrcpy(nid.szTip, GUARDIAN_APP_LABEL); // This will be true if we are using the explorer interface bInTaskBar = Shell_NotifyIcon(NIM_ADD, &nid); if (hIcon) DestroyIcon(hIcon); // This will be true if we are using the program manager interface if (!bInTaskBar) { char szMsgString[256]; HMENU hSysMenu = GetSystemMenu(hWnd, FALSE); DeleteMenu(hSysMenu, SC_RESTORE, MF_BYCOMMAND); AppendMenu(hSysMenu, MF_SEPARATOR, 0, NULL); LoadString(hInstance, IDS_SVRPROPERTIES, szMsgString, 256); AppendMenu(hSysMenu, MF_STRING, IDM_SVRPROPERTIES, szMsgString); LoadString(hInstance, IDS_SHUTDOWN, szMsgString, 256); AppendMenu(hSysMenu, MF_STRING, IDM_SHUTDOWN, szMsgString); LoadString(hInstance, IDS_PROPERTIES, szMsgString, 256); AppendMenu(hSysMenu, MF_STRING, IDM_PROPERTIES, szMsgString); DestroyMenu(hSysMenu); } } break; case WM_QUERYOPEN: if (!bInTaskBar) return FALSE; return DefWindowProc(hWnd, message, wParam, lParam); case WM_SYSCOMMAND: if (!bInTaskBar) switch (wParam) { case SC_RESTORE: return TRUE; case IDM_SHUTDOWN: { HWND hTmpWnd = FindWindow(szClassName, szWindowName); PostMessage(hTmpWnd, WM_COMMAND, (WPARAM) IDM_SHUTDOWN, 0); } return TRUE; case IDM_PROPERTIES: if (!hPSDlg) hPSDlg = DisplayPropSheet(hWnd, hInstance); else SetFocus(hPSDlg); return TRUE; case IDM_SVRPROPERTIES: { HWND hTmpWnd = FindWindow(szClassName, szWindowName); PostMessage(hTmpWnd, WM_COMMAND, (WPARAM) IDM_PROPERTIES, 0); } return TRUE; } return DefWindowProc(hWnd, message, wParam, lParam); case WM_DESTROY: if (bInTaskBar) { NOTIFYICONDATA nid; nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; nid.uID = IDI_IBGUARD; nid.uFlags = 0; Shell_NotifyIcon(NIM_DELETE, &nid); } PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return FALSE; }