#define LAY_IMPLEMENTATION\r
#include "layout.h"\r
\r
+#include <fstream>\r
+#include <vector>\r
+#include <string>\r
+\r
#include <Psapi.h>\r
#include <stdbool.h>\r
#include <stdio.h>\r
HANDLE process = NULL;\r
HWND hwnd;\r
HINSTANCE hInstance;\r
+HICON icon_white, icon_green, icon_red;\r
+\r
+std::vector<std::string> gameExes;\r
\r
\r
NOTIFYICONDATAA niData = { 0 };\r
Shell_NotifyIconA(NIM_DELETE, &niData);\r
}\r
\r
-void changeIcon(HWND hwnd, HINSTANCE hInstance, WORD id)\r
+void changeIcon(HWND hwnd, HICON icon)\r
{\r
- HICON icon = LoadIcon(hInstance, MAKEINTRESOURCE(id));\r
niData.hIcon = icon;\r
if (! IsWindowVisible(hwnd))\r
Shell_NotifyIconA(NIM_MODIFY, &niData);\r
startRecording()\r
{\r
ws::sendRequest("StartRecord");\r
- changeIcon(hwnd, hInstance, IDI_ICON_GREEN);\r
+ changeIcon(hwnd, icon_green);\r
}\r
\r
void\r
stopRecording()\r
{\r
ws::sendRequest("StopRecord");\r
- changeIcon(hwnd, hInstance, IDI_ICON_RED);\r
+ changeIcon(hwnd, icon_red);\r
}\r
\r
bool\r
HWND fgHwnd = GetForegroundWindow();\r
HANDLE fgHandle = getHwndProcess(fgHwnd);\r
\r
- char filename[1024];\r
- int len = GetModuleFileNameExA(fgHandle, NULL, filename, 1024);\r
+ char filename[MAX_PATH];\r
+ int len = GetModuleFileNameExA(fgHandle, NULL, filename, MAX_PATH);\r
+\r
+ if (strcmp(filename, exeName.c_str()) == 0)\r
+ return true;\r
+\r
PathStripPathA(filename);\r
\r
return strcmp(filename, exeName.c_str()) == 0;\r
}\r
\r
+void ReadGameExes()\r
+{\r
+ std::ifstream ifs("games.txt");\r
+\r
+ gameExes.clear();\r
+\r
+ while (ifs) {\r
+ std::string str;\r
+ std::getline(ifs, str);\r
+ if (! str.empty())\r
+ gameExes.push_back(str);\r
+ }\r
+\r
+ ifs.close();\r
+}\r
+\r
+void WriteGameExes()\r
+{\r
+ std::ofstream ofs("games.txt", std::ios::trunc);\r
+\r
+ 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
+/*\r
+TODO:\r
+ - Disconnect while recording\r
+*/\r
+\r
+\r
+\r
int WINAPI\r
WinMain(HINSTANCE hInstance,\r
HINSTANCE hPrevInstance,\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 = LoadIconA(hInstance, MAKEINTRESOURCEA(IDI_ICON_WHITE));\r
+ niData.hIcon = icon_white;\r
niData.hWnd = window.hwnd;\r
niData.uCallbackMessage = ICON_MSG;\r
niData.uVersion = NOTIFYICON_VERSION_4;\r
\r
win::Button btnConnect(&window, "Connect", row1, 100, 25, 0, 0);\r
btnConnect.onClick([&]() {\r
- ws::connect("ws://127.0.0.1:4444");\r
- });\r
- win::Button btnTest(&window, "Test", row1, 100, 25, 0, 0);\r
- btnTest.onClick([&]() {\r
- changeIcon(window.hwnd, hInstance, IDI_ICON_GREEN);\r
+ if (! ws::isConnected)\r
+ ws::connect("ws://127.0.0.1:4455");\r
});\r
\r
win::ListBox lstActiveProcesses(&window, row2, 0, 0, 0, LAY_FILL);\r
win::ListBox lstMonitoredProcesses(&window, row2, 0, 0, 0, LAY_FILL);\r
lstMonitoredProcesses.addStyle(WS_VSCROLL);\r
\r
+ ReadGameExes();\r
+ for (const auto &exe : gameExes)\r
+ lstMonitoredProcesses.addString(exe);\r
+\r
win::Button btnUpdateWindows(&window, "Update", col1, 85, 25, 0, 0);\r
win::Button btnStartMonitoringName(&window, "Exe name >>", col1, 85, 25, 0, 0);\r
win::Button btnStartMonitoringPath(&window, "Full path >>", col1, 85, 25, 0, 0);\r
\r
std::string selStr = lstActiveProcesses.getText(sel);\r
\r
- char *filename = new char[selStr.size()];\r
+ char *filename = new char[selStr.size()+1];\r
std::memcpy(filename, selStr.c_str(), selStr.size());\r
+ filename[selStr.size()] = '\0';\r
PathStripPathA(filename);\r
\r
- if (lstMonitoredProcesses.findString(std::string(filename)) == LB_ERR)\r
- lstMonitoredProcesses.addString(std::string(filename));\r
+ std::string filenameStr(filename);\r
+\r
+ if (lstMonitoredProcesses.findString(filenameStr) == LB_ERR)\r
+ {\r
+ lstMonitoredProcesses.addString(filenameStr);\r
+ gameExes.push_back(filenameStr);\r
+ WriteGameExes();\r
+ }\r
\r
delete[] filename;\r
});\r
if (sel < 0) return;\r
std::string selStr = lstActiveProcesses.getText(sel);\r
if (lstMonitoredProcesses.findString(selStr) == LB_ERR)\r
- lstMonitoredProcesses.addString(selStr);\r
+ {\r
+ lstMonitoredProcesses.addString(selStr);\r
+ gameExes.push_back(selStr);\r
+ WriteGameExes(); \r
+ }\r
});\r
btnStopMonitoring.onClick([&]() {\r
int sel = lstMonitoredProcesses.getSelectedIndex();\r
if (sel < 0) return;\r
lstMonitoredProcesses.remove(sel);\r
+ gameExes.erase(gameExes.begin() + sel);\r
+ WriteGameExes();\r
});\r
\r
window.show();\r
window.setDefaultFont();\r
\r
ws::onConnect = [&]() {\r
- changeIcon(window.hwnd, hInstance, IDI_ICON_RED);\r
+ changeIcon(window.hwnd, icon_red);\r
+ btnConnect.setActive(false);\r
};\r
+ ws::onClose = [&]() {\r
+ changeIcon(window.hwnd, icon_white);\r
+ btnConnect.setActive(true);\r
+ };\r
+ ws::onError = ws::onClose;\r
ws::init();\r
\r
- SetTimer(window.hwnd, 10123, 100, [](HWND, UINT, UINT_PTR, DWORD) {\r
+ window.setTimer(1000, [&btnConnect]() {\r
+ if (! ws::isConnected)\r
+ ws::connect("ws://127.0.0.1:4455");\r
+ });\r
+\r
+ window.setTimer(100, []() {\r
if (!recording) {\r
- if (checkForegroundProcess("League of Legends.exe")) {\r
- recording = true;\r
- process = getHwndProcess(GetForegroundWindow());\r
- startRecording();\r
+ for (auto exe : gameExes) {\r
+ if (checkForegroundProcess(exe)) {\r
+ recording = true;\r
+ process = getHwndProcess(GetForegroundWindow());\r
+ startRecording();\r
+ } \r
}\r
} else {\r
if (!checkProcessRunning(process)) {\r