+ for (const auto &exe : gameExes)\r
+ {\r
+ ofs.write(exe.c_str(), exe.size());\r
+ ofs.write("\n", 1);\r
+ }\r
+\r
+ ofs.close();\r
+}\r
+\r
+PROCESS_INFORMATION StartOBS()\r
+{\r
+ // delete .sentinel folder to stop obs from displaying\r
+ // error message on startup\r
+ system("del %appdata%\\obs-studio\\.sentinel /Q");\r
+\r
+ PROCESS_INFORMATION pi;\r
+ STARTUPINFOA sui;\r
+ GetStartupInfoA(&sui);\r
+ CreateProcessA(nullptr, "C:\\Program Files\\obs-studio\\bin\\64bit\\obs64.exe",\r
+ nullptr, nullptr, false, NORMAL_PRIORITY_CLASS, nullptr, "C:\\Program Files\\obs-studio\\bin\\64bit", &sui, &pi);\r
+ return pi;\r
+}\r
+\r
+void StopOBS(PROCESS_INFORMATION &pi)\r
+{\r
+ EnumWindows([](HWND hwnd, LPARAM lParam) -> BOOL {\r
+ PROCESS_INFORMATION *pi = (PROCESS_INFORMATION*)lParam;\r
+\r
+ DWORD pid, tid;\r
+ tid = GetWindowThreadProcessId(hwnd, &pid);\r
+ if (tid == pi->dwThreadId && pid == pi->dwProcessId) {\r
+\r
+ char title[1024]; GetWindowTextA(hwnd, title, 1024);\r
+\r
+ if (strncmp(title, "OBS", 3) == 0) {\r
+ PostMessage(hwnd, WM_CLOSE, 0, 0);\r
+ return FALSE; \r
+ }\r
+ }\r
+ return TRUE;\r
+ }, (LPARAM)&pi);\r
+}\r
+\r
+/*\r
+TODO:\r
+ - Disconnect while recording\r
+*/\r
+\r
+\r
+\r
+int WINAPI\r
+WinMain(HINSTANCE hInstance,\r
+ HINSTANCE hPrevInstance,\r
+ LPSTR lpCmdLine,\r
+ int nCmdShow)\r
+//int main(int argc, char **argv)\r
+{\r
+ hInstance = GetModuleHandle(0);\r
+\r
+ icon_white = LoadIconA(hInstance, MAKEINTRESOURCEA(IDI_ICON_WHITE));\r
+ icon_green = LoadIconA(hInstance, MAKEINTRESOURCEA(IDI_ICON_GREEN));\r
+ icon_red = LoadIconA(hInstance, MAKEINTRESOURCEA(IDI_ICON_RED));\r
+\r
+ win::Window window("Title", "MyWindowClass", hInstance);\r
+ hwnd = window.hwnd;\r
+\r
+ niData.cbSize = sizeof(niData);\r
+ niData.uID = 12345;\r
+ niData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;\r
+ niData.hIcon = icon_white;\r
+ niData.hWnd = window.hwnd;\r
+ niData.uCallbackMessage = ICON_MSG;\r
+ niData.uVersion = NOTIFYICON_VERSION_4;\r
+\r
+ PROCESS_INFORMATION pi_obs = StartOBS();\r
+\r
+ window.handlers[WM_SIZE].push_back([](HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {\r
+ if (wParam == SIZE_MINIMIZED) {\r
+ ShowNotificationIcon();\r
+ ShowWindow(hwnd, false);\r
+ }\r
+ });\r
+ window.handlers[WM_DESTROY].push_back([](HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {\r
+ HideNotificationIcon();\r
+ }); \r
+ window.handlers[ICON_MSG].push_back([](HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {\r
+ if (LOWORD(lParam) == NIN_SELECT) {\r
+ HideNotificationIcon();\r
+ ShowWindow(hwnd, true);\r
+ SetForegroundWindow(hwnd);\r
+ SetActiveWindow(hwnd);\r
+ }\r
+ });\r
+ window.handlers[WM_GETMINMAXINFO].push_back([](HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {\r
+ MINMAXINFO *mmInfo = (MINMAXINFO*)lParam;\r
+ mmInfo->ptMinTrackSize.x = 400;\r
+ mmInfo->ptMinTrackSize.y = 200;\r
+ });\r
+ window.handlers[WM_QUERYENDSESSION].push_back([&pi_obs](HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {\r
+ StopOBS(pi_obs);\r
+ }); window.handlers[WM_ENDSESSION].push_back([&pi_obs](HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {\r
+ StopOBS(pi_obs);\r
+ });\r
+ window.handlers[WM_CLOSE].push_back([&pi_obs](HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {\r
+ StopOBS(pi_obs);\r
+ });\r