#include "wintoastlib.h" #include #include using namespace WinToastLib; class CustomHandler : public IWinToastHandler { public: void toastActivated() const { std::wcout << L"The user clicked in this toast" << std::endl; exit(0); } void toastActivated(int actionIndex) const { std::wcout << L"The user clicked on action #" << actionIndex << std::endl; exit(16 + actionIndex); } void toastDismissed(WinToastDismissalReason state) const { switch (state) { case UserCanceled: std::wcout << L"The user dismissed this toast" << std::endl; exit(1); break; case TimedOut: std::wcout << L"The toast has timed out" << std::endl; exit(2); break; case ApplicationHidden: std::wcout << L"The application hid the toast using ToastNotifier.hide()" << std::endl; exit(3); break; default: std::wcout << L"Toast not activated" << std::endl; exit(4); break; } } void toastFailed() const { std::wcout << L"Error showing current toast" << std::endl; exit(5); } }; enum Results { ToastClicked, // user clicked on the toast ToastDismissed, // user dismissed the toast ToastTimeOut, // toast timed out ToastHided, // application hid the toast ToastNotActivated, // toast was not activated ToastFailed, // toast failed SystemNotSupported, // system does not support toasts UnhandledOption, // unhandled option MultipleTextNotSupported, // multiple texts were provided InitializationFailure, // toast notification manager initialization failure ToastNotLaunched // toast could not be launched }; #define COMMAND_ACTION L"--action" #define COMMAND_AUMI L"--aumi" #define COMMAND_APPNAME L"--appname" #define COMMAND_APPID L"--appid" #define COMMAND_EXPIREMS L"--expirems" #define COMMAND_TEXT L"--text" #define COMMAND_HELP L"--help" #define COMMAND_IMAGE L"--image" #define COMMAND_SHORTCUT L"--only-create-shortcut" #define COMMAND_AUDIOSTATE L"--audio-state" #define COMMAND_ATTRIBUTE L"--attribute" void print_help() { std::wcout << "WinToast Console Example [OPTIONS]" << std::endl; std::wcout << "\t" << COMMAND_ACTION << L" : Set the actions in buttons" << std::endl; std::wcout << "\t" << COMMAND_AUMI << L" : Set the App User Model Id" << std::endl; std::wcout << "\t" << COMMAND_APPNAME << L" : Set the default appname" << std::endl; std::wcout << "\t" << COMMAND_APPID << L" : Set the App Id" << std::endl; std::wcout << "\t" << COMMAND_EXPIREMS << L" : Set the default expiration time" << std::endl; std::wcout << "\t" << COMMAND_TEXT << L" : Set the text for the notifications" << std::endl; std::wcout << "\t" << COMMAND_IMAGE << L" : set the image path" << std::endl; std::wcout << "\t" << COMMAND_ATTRIBUTE << L" : set the attribute for the notification" << std::endl; std::wcout << "\t" << COMMAND_SHORTCUT << L" : create the shortcut for the app" << std::endl; std::wcout << "\t" << COMMAND_AUDIOSTATE << L" : set the audio state: Default = 0, Silent = 1, Loop = 2" << std::endl; std::wcout << "\t" << COMMAND_HELP << L" : Print the help description" << std::endl; } int wmain(int argc, LPWSTR* argv) { if (argc == 1) { print_help(); return 0; } if (!WinToast::isCompatible()) { std::wcerr << L"Error, your system in not supported!" << std::endl; return Results::SystemNotSupported; } std::wstring appName = L"Console WinToast Example"; std::wstring appUserModelID = L"WinToast Console Example"; std::wstring text = L""; std::wstring imagePath = L""; std::wstring attribute = L"default"; std::vector actions; INT64 expiration = 0; bool onlyCreateShortcut = false; WinToastTemplate::AudioOption audioOption = WinToastTemplate::AudioOption::Default; int i; for (i = 1; i < argc; i++) { if (!wcscmp(COMMAND_IMAGE, argv[i])) { imagePath = argv[++i]; } else if (!wcscmp(COMMAND_ACTION, argv[i])) { actions.push_back(argv[++i]); } else if (!wcscmp(COMMAND_EXPIREMS, argv[i])) { expiration = wcstol(argv[++i], NULL, 10); } else if (!wcscmp(COMMAND_APPNAME, argv[i])) { appName = argv[++i]; } else if (!wcscmp(COMMAND_AUMI, argv[i]) || !wcscmp(COMMAND_APPID, argv[i])) { appUserModelID = argv[++i]; } else if (!wcscmp(COMMAND_TEXT, argv[i])) { text = argv[++i]; } else if (!wcscmp(COMMAND_ATTRIBUTE, argv[i])) { attribute = argv[++i]; } else if (!wcscmp(COMMAND_SHORTCUT, argv[i])) { onlyCreateShortcut = true; } else if (!wcscmp(COMMAND_AUDIOSTATE, argv[i])) { audioOption = static_cast(std::stoi(argv[++i])); } else if (!wcscmp(COMMAND_HELP, argv[i])) { print_help(); return 0; } else { std::wcerr << L"Option not recognized: " << argv[i] << std::endl; return Results::UnhandledOption; } } WinToast::instance()->setAppName(appName); WinToast::instance()->setAppUserModelId(appUserModelID); if (onlyCreateShortcut) { if (!imagePath.empty() || !text.empty() || actions.size() > 0 || expiration) { std::wcerr << L"--only-create-shortcut does not accept images/text/actions/expiration" << std::endl; return 9; } enum WinToast::ShortcutResult result = WinToast::instance()->createShortcut(); return result ? 16 + result : 0; } if (text.empty()) { text = L"Hello, world!"; } if (!WinToast::instance()->initialize()) { std::wcerr << L"Error, your system in not compatible!" << std::endl; return Results::InitializationFailure; } WinToastTemplate templ(!imagePath.empty() ? WinToastTemplate::ImageAndText02 : WinToastTemplate::Text02); templ.setTextField(text, WinToastTemplate::FirstLine); templ.setAudioOption(audioOption); templ.setAttributionText(attribute); templ.setImagePath(imagePath); for (auto const& action : actions) { templ.addAction(action); } if (expiration) { templ.setExpiration(expiration); } if (WinToast::instance()->showToast(templ, new CustomHandler()) < 0) { std::wcerr << L"Could not launch your toast notification!"; return Results::ToastFailed; } // Give the handler a chance for 15 seconds (or the expiration plus 1 second) Sleep(expiration ? (DWORD) expiration + 1000 : 15000); exit(2); }