Initial WIN32 Impl
This commit is contained in:
1 parent
bbb0c220e1
commit
997586b8aa
24 files changed
+2087
-20
No files matched your search
+203
@@ -0,0 +1,203 @@
|
||||
#include "include/main.h"
|
||||
|
||||
bool connectedToSim = false;
|
||||
|
||||
// The Window Procedure
|
||||
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
static UINT s_uTaskbarRestart;
|
||||
|
||||
switch (msg) {
|
||||
case WM_CREATE:
|
||||
s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
|
||||
break;
|
||||
case WM_CLOSE: {
|
||||
toLog("Close");
|
||||
DestroyWindow(hWnd);
|
||||
break;
|
||||
}
|
||||
case WM_DESTROY: {
|
||||
toLog("Destroy");
|
||||
removeNotifyIcon(hWnd);
|
||||
UnregisterClass(WINDOW_CLASS, GetModuleHandle(NULL));
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
}
|
||||
case TRAY_MESSAGE: {
|
||||
switch (lParam) {
|
||||
case WM_RBUTTONUP:
|
||||
case WM_CONTEXTMENU: {
|
||||
const int IDM_EXIT = 100;
|
||||
POINT pt;
|
||||
GetCursorPos(&pt);
|
||||
|
||||
HMENU hMenu = CreatePopupMenu();
|
||||
AppendMenu(hMenu, MF_STRING | MF_GRAYED, NULL, "Version: " BIT);
|
||||
if (connectedToSim) {
|
||||
AppendMenu(hMenu, MF_STRING | MF_GRAYED, NULL, "Connected to Sim");
|
||||
}
|
||||
AppendMenu(hMenu, MF_SEPARATOR, NULL, NULL);
|
||||
AppendMenu(hMenu, MF_STRING, IDM_EXIT, "Exit");
|
||||
|
||||
SetForegroundWindow(hWnd);
|
||||
|
||||
WINBOOL cmd = TrackPopupMenu(hMenu,
|
||||
TPM_LEFTALIGN | TPM_LEFTBUTTON |
|
||||
TPM_BOTTOMALIGN | TPM_RETURNCMD,
|
||||
pt.x,
|
||||
pt.y,
|
||||
0,
|
||||
hWnd,
|
||||
NULL);
|
||||
|
||||
if (cmd == IDM_EXIT) {
|
||||
PostMessage(hWnd, WM_CLOSE, 0, NULL);
|
||||
}
|
||||
|
||||
DestroyMenu(hMenu);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
if (msg == s_uTaskbarRestart) {
|
||||
addNotifyIcon(hWnd);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return DefWindowProc(hWnd, msg, wParam, lParam);
|
||||
}
|
||||
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wunused-parameter"
|
||||
int WINAPI WinMain(HINSTANCE hInstance,
|
||||
HINSTANCE hPrevInstance,
|
||||
LPSTR lpCmdLine,
|
||||
int nCmdShow)
|
||||
{
|
||||
HANDLE simConnect;
|
||||
HRESULT hr;
|
||||
WNDCLASS wc;
|
||||
ZeroMemory(&wc, sizeof(WNDCLASS));
|
||||
HWND hWnd;
|
||||
MSG msg;
|
||||
|
||||
// Exit if already running
|
||||
hWnd = FindWindow(WINDOW_CLASS, WINDOW_CLASS);
|
||||
if (hWnd != NULL) {
|
||||
toLog("Exiting duplicate");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Clear log
|
||||
std::ofstream clearLog(BASE_DIRECTORY "log.txt");
|
||||
clearLog.close();
|
||||
|
||||
// Registering the Window Class
|
||||
wc.lpfnWndProc = WndProc;
|
||||
wc.hInstance = hInstance;
|
||||
wc.lpszClassName = WINDOW_CLASS;
|
||||
|
||||
if (!RegisterClass(&wc)) {
|
||||
toLog("Error window register: " + std::to_string(GetLastError()));
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Creating the Window
|
||||
hWnd = CreateWindow(WINDOW_CLASS,
|
||||
WINDOW_CLASS,
|
||||
WS_OVERLAPPEDWINDOW,
|
||||
CW_USEDEFAULT,
|
||||
CW_USEDEFAULT,
|
||||
240,
|
||||
120,
|
||||
NULL,
|
||||
NULL,
|
||||
hInstance,
|
||||
NULL);
|
||||
|
||||
if (hWnd == NULL) {
|
||||
toLog("Error window create: " + std::to_string(GetLastError()));
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Add Notify Icon
|
||||
if (!addNotifyIcon(hWnd)) {
|
||||
toLog("Error notifyIcon: " + std::to_string(GetLastError()));
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Never show window
|
||||
// ShowWindow(hWnd, SHOW_OPENWINDOW);
|
||||
|
||||
hr = SimConnect_Open(&simConnect, "GAConnector", hWnd, NULL, NULL, NULL);
|
||||
if (hr == E_FAIL) {
|
||||
toLog("SimConnect_Open failed");
|
||||
} else {
|
||||
connectedToSim = true;
|
||||
}
|
||||
|
||||
// The Message Loop
|
||||
while (GetMessage(&msg, NULL, 0, 0) > 0) {
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
|
||||
// Exit
|
||||
SimConnect_Close(&simConnect);
|
||||
toLog("Bye");
|
||||
return msg.wParam;
|
||||
}
|
||||
#pragma clang diagnostic pop
|
||||
|
||||
WINBOOL addNotifyIcon(HWND hWnd)
|
||||
{
|
||||
HICON icon;
|
||||
NOTIFYICONDATA niData;
|
||||
ZeroMemory(&niData, sizeof(NOTIFYICONDATA));
|
||||
|
||||
icon = (HICON)LoadImage(GetModuleHandle(NULL),
|
||||
MAKEINTRESOURCE(APP_ICON),
|
||||
IMAGE_ICON,
|
||||
GetSystemMetrics(SM_CXSMICON),
|
||||
GetSystemMetrics(SM_CYSMICON),
|
||||
LR_SHARED);
|
||||
if (icon == NULL) {
|
||||
toLog("error icon " + std::to_string(GetLastError()));
|
||||
}
|
||||
niData.cbSize = sizeof(NOTIFYICONDATA);
|
||||
niData.uVersion = NOTIFYICON_VERSION_4;
|
||||
niData.uID = TRAY_ICON_ID;
|
||||
niData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
|
||||
strcpy(niData.szTip, "GA Connector");
|
||||
niData.hIcon = icon;
|
||||
niData.hWnd = hWnd;
|
||||
niData.uCallbackMessage = TRAY_MESSAGE;
|
||||
|
||||
WINBOOL retVal = Shell_NotifyIcon(NIM_ADD, &niData);
|
||||
// DestroyIcon(niData.hIcon);
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
WINBOOL removeNotifyIcon(HWND hWnd)
|
||||
{
|
||||
NOTIFYICONDATA niData;
|
||||
ZeroMemory(&niData, sizeof(NOTIFYICONDATA));
|
||||
|
||||
niData.cbSize = sizeof(NOTIFYICONDATA);
|
||||
niData.uID = TRAY_ICON_ID;
|
||||
niData.hWnd = hWnd;
|
||||
return Shell_NotifyIcon(NIM_DELETE, &niData);
|
||||
}
|
||||
|
||||
void toLog(const std::string &message)
|
||||
{
|
||||
std::time_t utc = std::time(nullptr);
|
||||
std::tm *time = std::gmtime(&utc);
|
||||
std::ofstream msg(BASE_DIRECTORY "log.txt", std::ofstream::app);
|
||||
msg << std::put_time(time, "%Y-%m-%d %H:%M:%S UTC ")
|
||||
<< "German Airlines VA: " << message << std::endl;
|
||||
}
|
||||
Reference in new issue
Block a user