Exemplo n.º 1
0
static void clicked (GtkWidget *widget, GdkEventButton *event, gpointer data)
{
	switch(event->button) {
    case 1:	//left click
		OnTrayDefaultAction();
        break;
    case 2: //middle click
        break;
    case 3:	//right click
		ShowTrayMenu();
	    break;
    }
}
Exemplo n.º 2
0
LRESULT CWebInterfaceDlg::OnTrayMsg(WPARAM, LPARAM lp)
{
	switch (lp)
	{
		case WM_MOUSEMOVE:
			break;
		
		case WM_LBUTTONDOWN:
			OnConfigure ();
			break;

		case WM_RBUTTONUP:
			ShowTrayMenu ();
			break;
	}

	return 0;
}
Exemplo n.º 3
0
LRESULT CTeenSpiritDlg::OnTrayNotify(WPARAM wParam, LPARAM lParam) 
{ 
	if (wParam != IDR_MAINFRAME)
		return 0;
	switch (lParam ) 
	{ 
	case WM_MOUSEMOVE:
		{
			CPoint p;
			GetCursorPos(&p);
			if (m_ptTrayCursorPos != p)
			{
				m_ptTrayCursorPos = p;
				KillTimer(TMR_ShowTrayTooltipOnMouseMove);
				SetTimer(TMR_ShowTrayTooltipOnMouseMove, 100, NULL);
			}
		}
		break;
	case WM_LBUTTONDBLCLK:
	case WM_RBUTTONDBLCLK:
	case WM_RBUTTONDOWN:
		break;
	case WM_LBUTTONDOWN:
		PostMessage(WM_SYSCOMMAND, SC_RESTORE);
		break;
	case WM_CONTEXTMENU:
		break;
	case WM_RBUTTONUP:
		{
			CPoint pt;	
			GetCursorPos(&pt);
			ShowTrayMenu(pt);
		}
		break;
	} 
	return 0; 
} 
Exemplo n.º 4
0
/*static*/
bool Win32TrayItem::ShowTrayMenu(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int trayIconID = LOWORD(wParam);

	return ShowTrayMenu(trayIconID);
}
Exemplo n.º 5
0
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	static UINT s_uTaskBarCreated = 0;

	switch(uMsg)
	{
	case WM_CREATE:
		{
			g_hwndMain = hwnd;
			// Register task bar (re)creation in order to reload systray icons after explorer crashes
			s_uTaskBarCreated = RegisterWindowMessage(REGISTER_MESSAGE);

			// Set Icons
			SendMessage(hwnd, WM_SETICON, ICON_BIG, 
				(LONG)(LONG_PTR)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_MAIN_ICON), IMAGE_ICON, 
				GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR));

			SendMessage(hwnd, WM_SETICON, ICON_SMALL, 
				(LONG)(LONG_PTR)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_MAIN_ICON), IMAGE_ICON, 
				GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR));

			ShowWindow(hwnd, SW_HIDE);

			// Clear the list
			g_IconTray.clear();

			installHookKeyboard();

			// Open the configuration
			if (openConfig() == FALSE)
			{
				uninstallHookKeyboard();
				clearMenuSkin();

				MessageBox(g_hwndMain, L"Configuration file not found or invalid", ERR_MSGBOX_TITLE, NULL);

				PostQuitMessage(0);
				return 0;
			}

			// Retreive the version of Windows (in order to know if it is a win200 or superior)
			windowsVersion = GetWindowsVersion();

			// Initialisation of variables for menus
			InitMenuVars();

			// Add the system tray icons (depends of the configuration)
			ShowTrayIcons();

			// Show loading error messages
			if (g_loadingmessage != NULL) {
				ShowBalloon(ERR_MSGBOX_TITLE, g_loadingmessage, 0, NIIF_ERROR);
				free(g_loadingmessage);
				g_loadingmessage = NULL;
			}

			// Launch application in "autorun" mode
			fireEvent(PROG_EVENT_START);

			FlushMemory();
		}
		break;

	case WM_HOTKEY:
		if( (wParam >= IDH_HOTKEY_MENU) && (wParam <= (IDH_HOTKEY_MENU + g_portal->hotkeys.size()) ) )
		{
			// Detect application item or menu item in order to open a menu or launch the application
			PortalProg* l_sp = g_portal->hotkeys[ wParam - IDH_HOTKEY_MENU ];

			while( l_sp )
			{
				if( l_sp->progs.size() > 0 )
				{
					ShowTrayMenu(l_sp, PORTAL_MENU_HOTKEY);
				}
				else
				{
					l_sp->run(false);
					// Some commands could call quitPortal. In this case g_portal is set to NULL.
					if(g_portal == NULL)
						return 0;
				}
				l_sp = l_sp->nextSameHotkey;
			}
		}
		FlushMemory();
		break;

	case WM_DESTROY:
		{
			quitPortal();
		}
		break;

	case WM_MYTRAYMSG:
		if ((wParam >= IDI_MAIN_ICON) && g_portal && (wParam <= (IDI_MAIN_ICON + g_portal->menus.size())))
		{
			// Find the clicked systray
			int pos = (int)wParam - IDI_MAIN_ICON;
			if( ((UINT)lParam == WM_RBUTTONUP) || ((UINT)lParam == WM_LBUTTONUP) || ((UINT)lParam == WM_MOUSEMOVE) )
			{
				// Left click : minimalist menu
				// Right click : Complete menu (with About/Reload/Quit)
				// Auto Open : Complete menu (like right click) with a automatic dismiss
				int param = PORTAL_MENU_SYSTRAY;
				if((UINT)lParam == WM_RBUTTONUP)
				{
					param = PORTAL_MENU_SYSTRAY_CMD;
				}
				
				if( ((UINT)lParam == WM_MOUSEMOVE) )
				{
					if( (g_portal->menus[pos] != NULL) && (g_portal->menus[pos]->options & PROG_OPTION_AUTOOPEN) )
					{
						param = PORTAL_MENU_SYSTRAY_AUTO;
					}
					else
					{
						return 0;
					}
				}

				// Detect if the icon is for a menu or a application
				if( (g_portal->menus[pos] != NULL) && ( g_portal->menus[pos]->progs.size() > 0 ) )
				{
					ShowTrayMenu(g_portal->menus[pos], param);
					g_currentMenu = pos;
				}
				else if( (g_portal->menus[pos] != NULL) && (g_portal->menus[pos]->progExe != NULL ))
				{
					if((UINT)lParam == WM_LBUTTONUP)
					{
						g_portal->menus[pos]->run(true);
						g_currentMenu = pos;
					}
					else
					{
						ShowTrayMenu(g_portal->menus[pos], param);
						g_currentMenu = pos;
					}
				}
				else
				{
					ShowTrayMenu(NULL, param);
					g_currentMenu = 0;
				}
				FlushMemory();
			}
			else if( (UINT)lParam == NIN_BALLOONUSERCLICK )
			{
				if(g_aboutbaloon)
					checkGuiproVersion();
				FlushMemory();
				return 0;
			}
		}
		break;

	case WM_INITMENUPOPUP :
		OnInitMenuPopup(hwnd, wParam, lParam);
		break;

	case WM_UNINITMENUPOPUP:
		OnUninitMenuPopup(hwnd, wParam, lParam);
		break;

	case WM_MEASUREITEM :
		OnMeasureItem(hwnd, wParam, lParam);
		break;

	case WM_DRAWITEM :
		OnDrawItem(hwnd, wParam, lParam);
		break;

	case WM_MENUCHAR:
		return OnMenuCharItem(hwnd, wParam, lParam);

	case WM_COMMAND:
		// Retreive a menu command
		if( wParam == IDM_EXIT )
		{
			quitPortal();
		}
		else if( wParam == IDM_RELOAD )
		{
			reloadPortalConfig();
		}
		else if( wParam == IDM_ABOUT )
		{
			ShowAbout(g_currentMenu);
			FlushMemory();
		}
		else if( ((UINT)wParam >= (PORTAL_HK_ID)) && ( (UINT)wParam <= (UINT)(PORTAL_HK_ID + menuGetNbElem()) )  )
		{
			PortalProg* l_sp = menuGetElem( (int)(wParam - 1 - PORTAL_HK_ID) );
			l_sp->run(true);
			FlushMemory();
		}
		else if( ((UINT)wParam >= (PORTAL_FILE_ID)) && ( (UINT)wParam < (UINT)(PORTAL_FILE_ID + menuGetNbFiles()) ) )
		{
			PortalProg* l_sp = menuGetFile( (int)(wParam - PORTAL_FILE_ID) );
			l_sp->run(true);
			FlushMemory();

			for(PortalProgVector::iterator i = g_portal_files.begin(); i != g_portal_files.end(); i++)
			{
				delete (*i);
			}
			g_portal_files.clear();
		}
		break;

	default:
		if( uMsg == s_uTaskBarCreated )
		{
			// Traskbar (re)creation, we have to reset systray icons
			ReloadTrayIcons();
			FlushMemory();
		}
		else
		{
			return(DefWindowProc(hwnd, uMsg, wParam, lParam));
		}
		break;
	}
	return 0;
}
Exemplo n.º 6
0
INT_PTR CALLBACK DlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_COMMAND:
            if (HIWORD(wParam) == BN_CLICKED) {
                switch (LOWORD(wParam))
                {
                    case IDC_BTN_CONN:
                    case SWM_CONN:
                        on_button_connect_clicked();
                        break;
                    case IDC_BTN_EXIT:
                    case SWM_LOGOFF:
                        on_button_exit_clicked ();
                        break;
                    case IDC_CHK_AUTO_CON:
                        auto_con = IsDlgButtonChecked(hwnd, IDC_CHK_AUTO_CON);
                        reg_info_dword (reg_key, REG_KEY_AUTO_CON, TRUE, auto_con, NULL);
                        break;
                    case IDC_CHK_AUTO_MIN:
                        auto_min = IsDlgButtonChecked(hwnd, IDC_CHK_AUTO_MIN);
                        reg_info_dword (reg_key, REG_KEY_AUTO_MIN, TRUE, auto_min, NULL);
//                        if (auto_min && state == ONLINE && IsWindowVisible(hwnd)) {
//                            ShowWindow(hwnd, SW_HIDE);
//                        }
                        break;

                    case SWM_SHOW:
                        ShowWindow(hwnd, SW_RESTORE);
                        break;
                    case SWM_HIDE:
                    case IDOK:
                        ShowWindow(hwnd, SW_HIDE);
                        break;
                    case SWM_EXIT:
                        on_program_quit();
                        break;
                }
            }
            else if (HIWORD(wParam) == CBN_SELCHANGE) {
                combo_index = SendMessage((HWND)lParam, CB_GETCURSEL, 0, 0);
            }
            break;
        case SWM_TRAYMSG:
            switch(lParam)
            {
                case WM_LBUTTONDBLCLK:
                    if (IsWindowVisible(hwnd))
                        ShowWindow(hwnd, SW_HIDE);
                    else
                        ShowWindow(hwnd, SW_RESTORE);
                    break;
                case WM_RBUTTONDOWN:
                case WM_CONTEXTMENU:
                    ShowTrayMenu(hwnd);
                    break;
            }
            break;
        case WM_CLOSE:
            on_close_window_clicked();
            break;
    }
    return FALSE;
}
Exemplo n.º 7
0
LRESULT CALLBACK OptionsWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
	static HWND hwAppDesc, hwcPreventShutdown, hwcPreventSleep,
				hwgbBSOD, hwcBSODnoMouse, hwcBSODsecureDesk,
				hwcBSODnoTaskmgr, hwbBSOD;
	switch (message) {
		case WM_CREATE:
			hwAppDesc = CreateWindow(T("STATIC"),
					T("Welcome to CompuGuard, ")
					T("select something to guard:"),
					WS_CHILD | WS_VISIBLE | SS_LEFT,
					10, 10, 400, 20, hwnd, NULL,
					g_hInstance, NULL);

			hwcPreventShutdown = CreateWindow(TEXT("button"),
					TEXT("Prevent &Shutdown"),
					WS_VISIBLE | WS_CHILD | BS_CHECKBOX,
					10, 40, 190, 20,
					hwnd, (HMENU) OPTBTN_PREVENT_SHUTDOWN,
					g_hInstance, NULL);
			CheckDlgButton(hwnd, OPTBTN_PREVENT_SHUTDOWN, BST_CHECKED);

			hwcPreventSleep = CreateWindow(TEXT("button"),
					TEXT("Prevent S&leep"),
					WS_VISIBLE | WS_CHILD | BS_CHECKBOX,
					10, 60, 190, 20,
					hwnd, (HMENU) OPTBTN_PREVENT_SLEEP,
					g_hInstance, NULL);
			CheckDlgButton(hwnd, OPTBTN_PREVENT_SLEEP, BST_CHECKED);

			// Blue Screen Section
			hwgbBSOD = CreateWindow(TEXT("button"),
					TEXT("&Blue Screen of Death"),
					WS_VISIBLE | WS_CHILD | BS_GROUPBOX,
					210, 40, 190, 100, hwnd, NULL,
					g_hInstance, NULL);

			hwcBSODnoMouse = CreateWindow(
					TEXT("button"),
					TEXT("Disable &Mouse"),
					WS_VISIBLE | WS_CHILD | BS_CHECKBOX,
					220, 55, 150, 20,
					hwnd, (HMENU) OPTBTN_BSOD_DISABLE_MOUSE,
					g_hInstance, NULL);
			CheckDlgButton(hwnd, OPTBTN_BSOD_DISABLE_MOUSE, BST_CHECKED);

			hwcBSODsecureDesk = CreateWindow(
					TEXT("button"),
					TEXT("Use &Secure Desktop"),
					WS_VISIBLE | WS_CHILD | BS_CHECKBOX,
					220, 75, 150, 20,
					hwnd, (HMENU) OPTBTN_BSOD_SECURE_DESK,
					g_hInstance, NULL);
			CheckDlgButton(hwnd, OPTBTN_BSOD_SECURE_DESK, BST_CHECKED);

			hwcBSODnoTaskmgr = CreateWindow(
					TEXT("button"),
					TEXT("Disable &Task Manager"),
					WS_VISIBLE | WS_CHILD | BS_CHECKBOX,
					220, 75, 150, 20,
					hwnd, (HMENU) OPTBTN_BSOD_NO_TASKMGR,
					g_hInstance, NULL);
			CheckDlgButton(hwnd, OPTBTN_BSOD_NO_TASKMGR, BST_CHECKED);

			hwbBSOD = CreateWindow(TEXT("button"),
					TEXT("Show &BSOD"),
					WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
					220, 95, 170, 20,
					hwnd, (HMENU) OPTBTN_BSOD_RUN,
					g_hInstance, NULL);

			SendMessage(hwnd, WM_SETFONT, (WPARAM) g_hFont, TRUE);
			SendMessage(hwAppDesc, WM_SETFONT, (WPARAM) g_hFont, TRUE);
			SendMessage(hwcPreventShutdown, WM_SETFONT, (WPARAM) g_hFont, TRUE);
			SendMessage(hwcPreventSleep, WM_SETFONT, (WPARAM) g_hFont, TRUE);
			SendMessage(hwgbBSOD, WM_SETFONT, (WPARAM) g_hFont, TRUE);
			SendMessage(hwcBSODnoMouse, WM_SETFONT, (WPARAM) g_hFont, TRUE);
			SendMessage(hwcBSODsecureDesk, WM_SETFONT, (WPARAM) g_hFont, TRUE);
			SendMessage(hwbBSOD, WM_SETFONT, (WPARAM) g_hFont, TRUE);
			SendMessage(hwcBSODnoTaskmgr, WM_SETFONT, (WPARAM) g_hFont, TRUE);
			
			if (IsDlgButtonChecked(hwnd, OPTBTN_PREVENT_SHUTDOWN) &&
				fShutdownBlockReasonCreate != NULL)
					fShutdownBlockReasonCreate(hwnd, T("Jon Skeet said you can't shutdown!"));
			
			break;
		case WM_EXIT:
			if (ShowPasswordDialog(hwnd))
				DestroyWindow(hwnd);
			else
				MessageBox(hwnd, T("Wrong password!"), T("Error"), MB_ICONERROR);
			break;
		case WM_DESTROY:
			if (IsDlgButtonChecked(hwnd, OPTBTN_PREVENT_SHUTDOWN) &&
				fShutdownBlockReasonDestroy != NULL)
					fShutdownBlockReasonDestroy(hwnd);
			
			PostQuitMessage(0);
			break;
		case WM_TRAY:
			switch (lParam) {
				case WM_LBUTTONDBLCLK:
					ShowWindow(hwnd, IsWindowVisible(hwnd) ? SW_HIDE : SW_SHOW);
					break;
				case WM_RBUTTONDOWN:
					ShowTrayMenu(hwnd);
					break;
			}
			break;
		case WM_COMMAND:
			switch (LOWORD(wParam)) {
				case TRAYBTN_SHOW:
					ShowWindow(hwnd, IsWindowVisible(hwnd) ? SW_HIDE : SW_SHOW);
					break;
				case TRAYBTN_EXIT:
					PostMessage(hwnd, WM_EXIT, 0, 0);
					break;
				case OPTBTN_PREVENT_SHUTDOWN: {
					BOOL checked = IsDlgButtonChecked(hwnd, OPTBTN_PREVENT_SHUTDOWN);
					CheckDlgButton(hwnd, OPTBTN_PREVENT_SHUTDOWN,
							checked ? BST_UNCHECKED : BST_CHECKED);
					PreventShutdown(hwnd, checked);
					break;
				}
				case OPTBTN_PREVENT_SLEEP: {
					BOOL checked = IsDlgButtonChecked(hwnd, OPTBTN_PREVENT_SLEEP);
					CheckDlgButton(hwnd, OPTBTN_PREVENT_SLEEP,
							checked ? BST_UNCHECKED : BST_CHECKED);
					PreventSleep(checked);
					break;
				}
				case OPTBTN_BSOD_DISABLE_MOUSE: {
					g_BSODnoMouse = IsDlgButtonChecked(hwnd, OPTBTN_BSOD_DISABLE_MOUSE);
					CheckDlgButton(hwnd, OPTBTN_BSOD_DISABLE_MOUSE,
							g_BSODnoMouse ? BST_UNCHECKED : BST_CHECKED);
					break;
				}
				case OPTBTN_BSOD_SECURE_DESK: {
					g_BSODsecureDesk = IsDlgButtonChecked(hwnd, OPTBTN_BSOD_SECURE_DESK);
					CheckDlgButton(hwnd, OPTBTN_BSOD_SECURE_DESK,
							g_BSODsecureDesk ? BST_UNCHECKED : BST_CHECKED);
					break;
				}
				case OPTBTN_BSOD_NO_TASKMGR: {
					g_BSODnotaskmgr = IsDlgButtonChecked(hwnd, OPTBTN_BSOD_NO_TASKMGR);
					CheckDlgButton(hwnd, OPTBTN_BSOD_NO_TASKMGR,
							g_BSODnotaskmgr ? BST_UNCHECKED : BST_CHECKED);
					break;
				}
				case OPTBTN_BSOD_RUN:
					ShowBSOD();
					break;
			}
			break;
		case WM_CLOSE:
			ShowWindow(hwnd, SW_HIDE);
			return 0;
		case WM_QUERYENDSESSION:
			return !IsDlgButtonChecked(hwnd, OPTBTN_PREVENT_SHUTDOWN);
		case WM_CTLCOLORSTATIC: {
			HDC hdcStatic = (HDC) wParam;
			SetBkColor(hdcStatic, RGB(0xF0, 0xF0, 0xF0));
			return (INT_PTR) g_hBrush;
		}
		default:
			return DefWindowProc(hwnd, message, wParam, lParam);
	}
	return 0;
}
Exemplo n.º 8
0
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	static UINT s_uTaskBarCreated = 0;

	switch(uMsg)
	{
	case WM_CREATE:
		s_uTaskBarCreated = RegisterWindowMessage(L"TaskbarCreated");
		g_hwndMain = hwnd;

		// Set icons
		SendMessage(hwnd, WM_SETICON, ICON_BIG, 
			(LONG)(LONG_PTR)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_MAIN_ICON), IMAGE_ICON, 
			GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR));

		SendMessage(hwnd, WM_SETICON, ICON_SMALL, 
			(LONG)(LONG_PTR)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_TRAY_ICON), IMAGE_ICON, 
			GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR));

		// call uninstall hook keyboard to clean the override key array
		uninstallHookKeyboard();

		// Set the Tray Icon
		ReloadExTrayIcon();

		if (openConfig() == 1)
		{
			MessageBox(g_hwndMain, L"No config file", L"Error", NULL);
			GUIProQuit();
			return 0;
		}

		if (!registerConfig(TRUE))
		{
			GUIProQuit();
			return 0;
		}

		/*
		myRegisterHotKey(VK_ADD, MOD_CONTROL | MOD_WIN, IDH_HOTKEY_VOL_UP, true);
		myRegisterHotKey(VK_SUBTRACT, MOD_CONTROL | MOD_WIN, IDH_HOTKEY_VOL_DOWN, true);
		myRegisterHotKey(VK_NUMPAD0, MOD_CONTROL | MOD_WIN, IDH_HOTKEY_VOL_MUTE, true);
		*/
		// Clean the memory in order to have a light application
		FlushMemory();
		break;

	case WM_DESTROY:
		GUIProQuit();
		break;

	case WM_HOTKEY:
		{
			int ret = -2;
			switch (wParam) {
				case IDH_HOTKEY_VOL_UP:
					ret = changeVolumeUp();
					break;
				case IDH_HOTKEY_VOL_DOWN:
					ret = changeVolumeDown();
					break;
				case IDH_HOTKEY_VOL_MUTE:
					ret = changeVolumeMute();
					if (ret > 0)
						ret = getVolume();
					break;
			}

			if (ret >= 0)
			{
				ShowVolumeBalloon(ret);
			}

			unloadVolumeInterface();
			FlushMemory();
		}
		break;

	case WM_MYTRAYMSG:
		// Tray Icon event
		if (wParam == IDI_MAIN_ICON)
		{
			if ((UINT)lParam == WM_RBUTTONUP) 
			{
				ShowTrayMenu();
				FlushMemory();
			}
			else if ((UINT)lParam == WM_LBUTTONUP)
			{
				ShowVolumeBalloon(-1);
				FlushMemory();
			}
		}
		break;

	default:
		if( uMsg == s_uTaskBarCreated )
		{
			ReloadExTrayIcon();
			FlushMemory();
		}
		else
		{
			return(DefWindowProc(hwnd, uMsg, wParam, lParam));
		}
		break;
	}
	return 0;
}
Exemplo n.º 9
0
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {

	static BOOL s_fConfirmActive = FALSE;
	static UINT s_uTaskbarCreated = 0;

	switch (uMsg) {

		case WM_HOTKEY: {

			switch (wParam) {

				case IDH_NEXTTASK:
				case IDH_PREVTASK:
				case IDH_WINNEXTTASK:
				case IDH_WINPREVTASK:
				case IDH_INSTNEXT:
				case IDH_INSTPREV:
				case IDH_STNEXTTASK:
				case IDH_STINEXTTASK:
					ShowTaskSwitchWnd((UINT)wParam);
					break;

				case IDH_MINIMIZETRAY:
					FlipToTray(GetForegroundWindow());
					break;

				case IDH_RESTORETRAY:
					if (g_cWti > 0)
						_UnflipFromTray(g_cWti - 1);
					break;

				case IDH_SHOWHIDE:
					ShowTrayIcon(!(g_dwFlags & TSF_SHOWTRAYICON));
					break;

				case IDH_CONFIG:
					ConfigTaskSwitchXP();
					break;
				case IDH_ALTAPPLIST:
					//MessageBox (0, L"This must display alternative task switching window\r\n"
					//	L"(or the same window but in alternative mode)", L"klvov says:", MB_OK);
					//ShowAltTSWindow();
					//OutputDebugString(L"IDH_ALTAPPLIST message received\n");
					ShowTaskSwitchWnd((UINT)wParam);
					break;

				case IDH_EXIT:
					if (!(g_dwFlags & TSF_NOCONFIRMEXIT)) {
						if (s_fConfirmActive) { // activate confirm dialog
#pragma FIX_LATER(multiple exit confirmations)
							break;
							/*HWND hwndMsg = FindWindowEx(NULL, NULL, L"#32770", L"TaskSwitchXP confirmation");
							if (hwndMsg) {
								SetForegroundWindow(hwndMsg);
								break;
							}*/
						}

						s_fConfirmActive = TRUE;
						if (ConfirmMessage(IDS_CONFIRM_EXIT))
							DestroyWindow(hwnd);
						s_fConfirmActive = FALSE;
					} else 
						DestroyWindow(hwnd);
					break;
			}
			break;
							}

		case WM_TIMER:
			if (wParam == TIMER_RIGHTUP) {
				KillTimer(hwnd, TIMER_RIGHTUP);
				mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_RIGHTUP, 
					_ptRClick.x, _ptRClick.y, _dwRData, _dwRExtraInfo);
			} else if (wParam == TIMER_SETANIMATION) {
				KillTimer(hwnd, TIMER_SETANIMATION);
				ANIMATIONINFO ai;
				ai.cbSize = sizeof(ANIMATIONINFO);
				ai.iMinAnimate = TRUE;
				SystemParametersInfo(SPI_SETANIMATION, sizeof(ANIMATIONINFO), &ai, FALSE);
			} else if (wParam == TIMER_CHECKTRAYWND) {
				for (UINT i = 0; i < g_cWti; i++) {
					if (!IsWindow(g_pWti[i].hwnd) || IsWindowVisible(g_pWti[i].hwnd))
						_UnflipFromTray(i, SC_MINIMIZE);
				}
			} else if (wParam == TIMER_RELOADICONS) {
				if (!(g_dwFlags & TSF_RELOADICONS))
					KillTimer(hwnd, TIMER_RELOADICONS);
				ReloadTsTrayIcons();
			} else if (wParam == TIMER_CHECKCOLORS) {
				KillTimer(hwnd, TIMER_CHECKCOLORS);
				if (CheckColorTheme())
					CheckDefaultColors();
			} else if (wParam == TIMER_CLOSEDESK) {
				if (WaitForSingleObject(g_hThreadTs, 0) == WAIT_OBJECT_0) {
					KillTimer(hwnd, TIMER_CLOSEDESK);
					//_RPT0(_CRT_WARN, "close desk\n");
					if (g_hThreadTs) {
						CloseHandle(g_hThreadTs);
						g_hThreadTs = NULL;
					}
					if (g_hDesk) {
						CloseDesktop(g_hDesk);
						g_hDesk = NULL;
					}
				}
			}
			break;

		case WM_REMOTECMD:
			SwitchToThisWindow(hwnd, TRUE);
			if (wParam & CCLF_ESCAPE) {
				if (g_hwndTs)
					PostMessage(g_hwndTs, WM_TASKSWITCH, IDH_ESCAPE, 0);
			} else if (wParam & CCLF_STINEXTTASK) {
				ShowTaskSwitchWnd(IDH_STINEXTTASK);
			} else if (wParam & CCLF_STNEXTTASK) {
				ShowTaskSwitchWnd(IDH_STNEXTTASK);
			}
			break;

		case WM_MYTRAYMSG:
			if (wParam == IDI_TASKSWITCHXP) {
				if ((UINT)lParam == g_uTrayMenu) {
					ShowTrayMenu();
				} else if ((UINT)lParam == g_uTrayConfig) {
					ConfigTaskSwitchXP();
				} else if ((UINT)lParam == g_uTrayNext) {
					ShowTaskSwitchWnd(IDH_STTRAYNEXT);
				} else if ((UINT)lParam == g_uTrayPrev) {
					ShowTaskSwitchWnd(IDH_STITRAYNEXT);
				}
			} else {
				if (lParam == WM_LBUTTONUP) {
                    UnflipFromTrayID((UINT)wParam);
				} else if (lParam == WM_RBUTTONUP) {
					ShowFlippedSystemMenu((UINT)wParam);
				} else if (lParam == WM_MBUTTONUP)
					UnflipFromTrayID((UINT)wParam, 0);
			}
			break;

		case WM_EXTMOUSE:
			if (wParam == HTMINBUTTON) {
				FlipToTray((HWND)lParam);
			} else if (wParam == HTMAXBUTTON) {
				HWND h = (HWND)lParam;
				DWORD dwExStyle = GetWindowLongPtr(h, GWL_EXSTYLE);
				SetWindowPos(h, ((dwExStyle & WS_EX_TOPMOST) 
					? HWND_NOTOPMOST : HWND_TOPMOST), 0, 0, 0, 0, 
					SWP_NOSIZE | SWP_NOMOVE);
			}
			break;

		case WM_FLIPTOTRAY:
			return(FlipToTray((HWND)wParam));
			//break;

		case WM_UNFLIPFROMTRAY:
			UnflipFromTray((HWND)wParam, (UINT)lParam);
			break;

		case WM_GETTRAYWINDOWS:
			if (wParam) {
				HWND *phWnd = (HWND*)wParam;
				int cWti = 0;
				while (cWti < MIN((int)lParam, (int)g_cWti)) {
					phWnd[cWti] = g_pWti[cWti].hwnd;
					cWti++;
				}
				return(cWti);
			} else 
				return(g_cWti);
			break;

		case WM_RELOADSETTINGS:
			if (!LoadSettings()) {
				ReportError(IDS_ERR_LOADSETTINGS);
				DestroyWindow(hwnd);
			}
			break;

		case WM_THEMECHANGED:
			if (CheckColorTheme())
				CheckDefaultColors();
			SetTimer(hwnd, TIMER_CHECKCOLORS, 1000, NULL);
			break;

		case WM_CREATE: {

			s_uTaskbarCreated = RegisterWindowMessage(L"TaskbarCreated");
			g_hwndMain = hwnd;

			SendMessage(hwnd, WM_SETICON, ICON_BIG, 
				(LONG)(LONG_PTR)LoadImage(g_hinstExe, MAKEINTRESOURCE(IDI_TASKSWITCHXP), IMAGE_ICON, 
				GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR));
			SendMessage(hwnd, WM_SETICON, ICON_SMALL, 
				(LONG)(LONG_PTR)LoadImage(g_hinstExe, MAKEINTRESOURCE(IDI_TASKSWITCHXP), IMAGE_ICON, 
				GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR));

			if (!LoadSettings()) {
				ReportError(IDS_ERR_LOADSETTINGS);
				return(-1);
			}
			if (!InitPreviewThread())
				return(-1);

			// Weird huh? I cannot understand this...
			if (g_dwShowDelay && g_dwFlagsPv & TSFPV_DESKTOP && g_dwFlagsPv & TSFPV_TASKBAR) {

				RECT rcPvEx;
				rcPvEx.left = rcPvEx.top = 0;
				rcPvEx.right = 102;
				rcPvEx.bottom = 76;
				HDC hdcScreen = GetDC(NULL);
				HDC hdcMem = CreateCompatibleDC(hdcScreen);
				HBITMAP hbitmapMem = CreateCompatibleBitmap(hdcScreen, 
					rcPvEx.right - rcPvEx.left, rcPvEx.bottom - rcPvEx.top);
				ReleaseDC(NULL, hdcScreen);

				if (hbitmapMem) {
					HBITMAP hbitmapOld = (HBITMAP)SelectObject(hdcMem, hbitmapMem);

					SetForegroundWindow(g_hwndMain);
					MyPrintWindow(FindWindow(L"Shell_TrayWnd", L""), 
						hdcMem, &rcPvEx, &rcPvEx, MPW_NOCHECKPOS);

					SelectObject(hdcMem, hbitmapOld);
					DeleteObject(hbitmapMem);
				}
				DeleteDC(hdcMem);
			}
			SetTimer(hwnd, TIMER_CHECKTRAYWND, 1000, NULL);

			if (g_dwCmdLine & CCLF_STINEXTTASK) {
				ShowTaskSwitchWnd(IDH_STINEXTTASK);
			} else if (g_dwCmdLine & CCLF_STNEXTTASK) {
				ShowTaskSwitchWnd(IDH_STNEXTTASK);
			}
			break;
						}

		case WM_CLOSE:
			break;

		case WM_DESTROY:
			KillTimer(hwnd, TIMER_CHECKTRAYWND);
			DestroySettings();
			DestroyPreviewThread();
			for (int i = (int)g_cWti - 1; i >= 0; i--)
				_UnflipFromTray((UINT)i, 0);
			PostQuitMessage(0);
			break;

		default:
			if (uMsg == s_uTaskbarCreated) {
				ReloadTsTrayIcons();
			} else 
				return(DefWindowProc(hwnd, uMsg, wParam, lParam));
			break;
	}
	return(0);
}