From 85503b092f6516ad0fcf24018b6ff4d67a457146 Mon Sep 17 00:00:00 2001 From: Ox Cart Date: Mon, 11 Sep 2017 22:08:57 -0500 Subject: [PATCH] Added back VisualStudio files --- .gitignore | 1 + systray/systray/ReadMe.txt | 48 ++++++ systray/systray/dllmain.cpp | 19 +++ systray/systray/stdafx.cpp | 8 + systray/systray/stdafx.h | 17 ++ systray/systray/systray.cpp | 207 ++++++++++++++++++++++++ systray/systray/systray.def | 9 ++ systray/systray/systray.h | 13 ++ systray/systray/systray.vcxproj | 176 ++++++++++++++++++++ systray/systray/systray.vcxproj.filters | 45 ++++++ systray/systray/systray.vcxproj.user | 3 + systray/systray/targetver.h | 8 + 12 files changed, 554 insertions(+) create mode 100755 systray/systray/ReadMe.txt create mode 100755 systray/systray/dllmain.cpp create mode 100755 systray/systray/stdafx.cpp create mode 100755 systray/systray/stdafx.h create mode 100755 systray/systray/systray.cpp create mode 100755 systray/systray/systray.def create mode 100755 systray/systray/systray.h create mode 100755 systray/systray/systray.vcxproj create mode 100755 systray/systray/systray.vcxproj.filters create mode 100755 systray/systray/systray.vcxproj.user create mode 100755 systray/systray/targetver.h diff --git a/.gitignore b/.gitignore index a668c37..81f16eb 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ Debug *.sdf dll/systray_unsigned.dll out.txt +.vs diff --git a/systray/systray/ReadMe.txt b/systray/systray/ReadMe.txt new file mode 100755 index 0000000..7e906df --- /dev/null +++ b/systray/systray/ReadMe.txt @@ -0,0 +1,48 @@ +======================================================================== + DYNAMIC LINK LIBRARY : systray Project Overview +======================================================================== + +AppWizard has created this systray DLL for you. + +This file contains a summary of what you will find in each of the files that +make up your systray application. + + +systray.vcxproj + This is the main project file for VC++ projects generated using an Application Wizard. + It contains information about the version of Visual C++ that generated the file, and + information about the platforms, configurations, and project features selected with the + Application Wizard. + +systray.vcxproj.filters + This is the filters file for VC++ projects generated using an Application Wizard. + It contains information about the association between the files in your project + and the filters. This association is used in the IDE to show grouping of files with + similar extensions under a specific node (for e.g. ".cpp" files are associated with the + "Source Files" filter). + +systray.cpp + This is the main DLL source file. + + When created, this DLL does not export any symbols. As a result, it + will not produce a .lib file when it is built. If you wish this project + to be a project dependency of some other project, you will either need to + add code to export some symbols from the DLL so that an export library + will be produced, or you can set the Ignore Input Library property to Yes + on the General propert page of the Linker folder in the project's Property + Pages dialog box. + +///////////////////////////////////////////////////////////////////////////// +Other standard files: + +StdAfx.h, StdAfx.cpp + These files are used to build a precompiled header (PCH) file + named systray.pch and a precompiled types file named StdAfx.obj. + +///////////////////////////////////////////////////////////////////////////// +Other notes: + +AppWizard uses "TODO:" comments to indicate parts of the source code you +should add to or customize. + +///////////////////////////////////////////////////////////////////////////// diff --git a/systray/systray/dllmain.cpp b/systray/systray/dllmain.cpp new file mode 100755 index 0000000..8a4edd3 --- /dev/null +++ b/systray/systray/dllmain.cpp @@ -0,0 +1,19 @@ +// dllmain.cpp : Defines the entry point for the DLL application. +#include "stdafx.h" + +BOOL APIENTRY DllMain( HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + diff --git a/systray/systray/stdafx.cpp b/systray/systray/stdafx.cpp new file mode 100755 index 0000000..a71cba8 --- /dev/null +++ b/systray/systray/stdafx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// systray.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/systray/systray/stdafx.h b/systray/systray/stdafx.h new file mode 100755 index 0000000..7e739d9 --- /dev/null +++ b/systray/systray/stdafx.h @@ -0,0 +1,17 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#include "targetver.h" + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +// Windows Header Files: +#include +// Additional required headers +#include +#include +#include +#include diff --git a/systray/systray/systray.cpp b/systray/systray/systray.cpp new file mode 100755 index 0000000..079f816 --- /dev/null +++ b/systray/systray/systray.cpp @@ -0,0 +1,207 @@ +// systray.cpp : Defines the exported functions for the DLL application. +// + +// dllmain.cpp : Defines the entry point for the DLL application. +#include "stdafx.h" +#include "systray.h" + +// Message posted into message loop when Notification Icon is clicked +#define WM_SYSTRAY_MESSAGE (WM_USER + 1) + +static NOTIFYICONDATA nid; +static HWND hWnd; +static HMENU hTrayMenu; + +void (*systray_on_exit)(int ignored); +void (*systray_menu_item_selected)(int menu_id); + +void reportWindowsError(const char* action) { + LPTSTR pErrMsg = NULL; + DWORD errCode = GetLastError(); + DWORD result = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER| + FORMAT_MESSAGE_FROM_SYSTEM| + FORMAT_MESSAGE_ARGUMENT_ARRAY, + NULL, + errCode, + LANG_NEUTRAL, + pErrMsg, + 0, + NULL); + printf("Systray error %s: %d %ls\n", action, errCode, pErrMsg); +} + +void ShowMenu(HWND hWnd) { + POINT p; + if (0 == GetCursorPos(&p)) { + reportWindowsError("get tray menu position"); + return; + }; + SetForegroundWindow(hWnd); // Win32 bug work-around + TrackPopupMenu(hTrayMenu, TPM_BOTTOMALIGN | TPM_LEFTALIGN, p.x, p.y, 0, hWnd, NULL); + +} + +LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { + switch (message) { + case WM_COMMAND: + { + int menuId = LOWORD(wParam); + if (menuId != -1) { + systray_menu_item_selected(menuId); + } + } + break; + case WM_DESTROY: + printf("Window destroyed\n"); + systray_on_exit(0/*ignored*/); + Shell_NotifyIcon(NIM_DELETE, &nid); + PostQuitMessage(0); + break; + case WM_ENDSESSION: + printf("Session ending\n"); + // When the system shuts down (or logs off), we don't receive WM_DESTROY, + // so we capture WM_ENDSESSION instead and call on_exit here too. + systray_on_exit(0/*ignored*/); + Shell_NotifyIcon(NIM_DELETE, &nid); + break; + case WM_SYSTRAY_MESSAGE: + switch(lParam) { + case WM_RBUTTONUP: + ShowMenu(hWnd); + break; + case WM_LBUTTONUP: + ShowMenu(hWnd); + break; + default: + return DefWindowProc(hWnd, message, wParam, lParam); + }; + break; + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + return 0; +} + +void MyRegisterClass(HINSTANCE hInstance, TCHAR* szWindowClass) { + WNDCLASSEX wcex; + + wcex.cbSize = sizeof(WNDCLASSEX); + wcex.style = CS_HREDRAW | CS_VREDRAW; + wcex.lpfnWndProc = WndProc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = hInstance; + wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION); + wcex.hCursor = LoadCursor(NULL, IDC_ARROW); + wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); + wcex.lpszMenuName = 0; + wcex.lpszClassName = szWindowClass; + wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION); + + RegisterClassEx(&wcex); +} + +HWND InitInstance(HINSTANCE hInstance, int nCmdShow, TCHAR* szWindowClass) { + HWND hWnd = CreateWindow(szWindowClass, TEXT(""), WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); + if (!hWnd) { + return 0; + } + + ShowWindow(hWnd, nCmdShow); + UpdateWindow(hWnd); + + return hWnd; +} + + +BOOL createMenu() { + hTrayMenu = CreatePopupMenu(); + MENUINFO menuInfo; + menuInfo.cbSize = sizeof(MENUINFO); + menuInfo.fMask = MIM_APPLYTOSUBMENUS | MIM_STYLE; + return SetMenuInfo(hTrayMenu, &menuInfo); +} + +BOOL addNotifyIcon() { + nid.cbSize = sizeof(NOTIFYICONDATA); + nid.hWnd = hWnd; + nid.uID = 100; + nid.uCallbackMessage = WM_SYSTRAY_MESSAGE; + nid.uFlags = NIF_MESSAGE; + return Shell_NotifyIcon(NIM_ADD, &nid); +} + +int nativeLoop(void (*systray_ready)(int ignored), + void (*_systray_on_exit)(int ignored), + void (*_systray_menu_item_selected)(int menu_id)) { + systray_on_exit = _systray_on_exit; + systray_menu_item_selected = _systray_menu_item_selected; + + HINSTANCE hInstance = GetModuleHandle(NULL); + TCHAR* szWindowClass = TEXT("SystrayClass"); + MyRegisterClass(hInstance, szWindowClass); + hWnd = InitInstance(hInstance, FALSE, szWindowClass); // Don't show window + if (!hWnd) { + return EXIT_FAILURE; + } + if (!createMenu() || !addNotifyIcon()) { + return EXIT_FAILURE; + } + systray_ready(0); + + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + return EXIT_SUCCESS; +} + + +void setIcon(const wchar_t* iconFile) { + HICON hIcon = (HICON) LoadImage(NULL, iconFile, IMAGE_ICON, 64, 64, LR_LOADFROMFILE); + if (hIcon == NULL) { + reportWindowsError("load icon image"); + } else { + nid.hIcon = hIcon; + nid.uFlags = NIF_ICON; + Shell_NotifyIcon(NIM_MODIFY, &nid); + } +} + +void setTooltip(const wchar_t* tooltip) { + wcsncpy_s(nid.szTip, tooltip, sizeof(nid.szTip)/sizeof(wchar_t)); + nid.uFlags = NIF_TIP; + Shell_NotifyIcon(NIM_MODIFY, &nid); +} + +void add_or_update_menu_item(int menuId, wchar_t* title, wchar_t* tooltip, short disabled, short checked) { + MENUITEMINFO menuItemInfo; + menuItemInfo.cbSize = sizeof(MENUITEMINFO); + menuItemInfo.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_ID | MIIM_STATE; + menuItemInfo.fType = MFT_STRING; + menuItemInfo.dwTypeData = title; + menuItemInfo.cch = wcslen(title) + 1; + menuItemInfo.wID = menuId; + menuItemInfo.fState = 0; + if (disabled == 1) { + menuItemInfo.fState |= MFS_DISABLED; + } + if (checked == 1) { + menuItemInfo.fState |= MFS_CHECKED; + } + + BOOL setOK = SetMenuItemInfo(hTrayMenu, menuId, FALSE, &menuItemInfo); + if (!setOK) { + InsertMenuItem(hTrayMenu, menuId, TRUE, &menuItemInfo); + } +} + +void hide_menu_item(int menuId) { + DeleteMenu(hTrayMenu, menuId, MF_BYCOMMAND); +} + +void quit() { + PostMessage(hWnd, WM_CLOSE, 0, 0); +} diff --git a/systray/systray/systray.def b/systray/systray/systray.def new file mode 100755 index 0000000..7a1e239 --- /dev/null +++ b/systray/systray/systray.def @@ -0,0 +1,9 @@ +LIBRARY systray +DESCRIPTION "System Tray Support" +EXPORTS + nativeLoop @1 + setIcon @2 + setTooltip @3 + add_or_update_menu_item @4 + hide_menu_item @5 + quit @6 \ No newline at end of file diff --git a/systray/systray/systray.h b/systray/systray/systray.h new file mode 100755 index 0000000..8344668 --- /dev/null +++ b/systray/systray/systray.h @@ -0,0 +1,13 @@ +#pragma once + +extern "C" { + __declspec(dllexport) int __cdecl nativeLoop(void (*systray_ready)(int ignored), + void (*_systray_on_exit)(int ignored), + void (*_systray_menu_item_selected)(int menu_id)); + + __declspec(dllexport) void __cdecl setIcon(const wchar_t* iconFile); + __declspec(dllexport) void __cdecl setTooltip(const wchar_t* tooltip); + __declspec(dllexport) void __cdecl add_or_update_menu_item(int menuId, wchar_t* title, wchar_t* tooltip, short disabled, short checked); + __declspec(dllexport) void __cdecl hide_menu_item(int menuId); + __declspec(dllexport) void __cdecl quit(); +} \ No newline at end of file diff --git a/systray/systray/systray.vcxproj b/systray/systray/systray.vcxproj new file mode 100755 index 0000000..1fdff40 --- /dev/null +++ b/systray/systray/systray.vcxproj @@ -0,0 +1,176 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {7DD84108-D77F-4F51-AC68-5DD13AC1E489} + Win32Proj + systray + + + + DynamicLibrary + true + Unicode + v140 + + + DynamicLibrary + true + Unicode + v140 + + + DynamicLibrary + false + true + Unicode + v140 + + + DynamicLibrary + false + true + Unicode + v140 + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;SYSTRAY_EXPORTS;%(PreprocessorDefinitions) + MultiThreadedDebug + + + Windows + true + + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;SYSTRAY_EXPORTS;%(PreprocessorDefinitions) + MultiThreadedDebug + + + Windows + true + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;SYSTRAY_EXPORTS;%(PreprocessorDefinitions) + MultiThreaded + + + Windows + true + true + true + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;SYSTRAY_EXPORTS;%(PreprocessorDefinitions) + MultiThreaded + + + Windows + true + true + true + + + + + + + + + + + + + + false + false + + + + + false + false + + + + + + + Create + Create + Create + Create + + + + + + + \ No newline at end of file diff --git a/systray/systray/systray.vcxproj.filters b/systray/systray/systray.vcxproj.filters new file mode 100755 index 0000000..af0af76 --- /dev/null +++ b/systray/systray/systray.vcxproj.filters @@ -0,0 +1,45 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/systray/systray/systray.vcxproj.user b/systray/systray/systray.vcxproj.user new file mode 100755 index 0000000..695b5c7 --- /dev/null +++ b/systray/systray/systray.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/systray/systray/targetver.h b/systray/systray/targetver.h new file mode 100755 index 0000000..90e767b --- /dev/null +++ b/systray/systray/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include