#include <windows.h>\r
#include <shlwapi.h>\r
\r
+bool recording = false;\r
+HANDLE process = NULL;\r
+HWND hwnd;\r
+HINSTANCE hInstance;\r
+\r
+\r
+NOTIFYICONDATAA niData = { 0 };\r
+const UINT ICON_MSG = WM_APP+1;\r
+void\r
+ShowNotificationIcon()\r
+{\r
+ Shell_NotifyIconA(NIM_ADD, &niData);\r
+ Shell_NotifyIconA(NIM_SETVERSION, &niData);\r
+}\r
+\r
+void\r
+HideNotificationIcon()\r
+{\r
+ Shell_NotifyIconA(NIM_DELETE, &niData);\r
+}\r
+\r
+void changeIcon(HWND hwnd, HINSTANCE hInstance, WORD id)\r
+{\r
+ HICON icon = LoadIcon(hInstance, MAKEINTRESOURCE(id));\r
+ HideNotificationIcon();\r
+ niData.hIcon = icon;\r
+ if (! IsWindowVisible(hwnd))\r
+ ShowNotificationIcon();\r
+ SendMessage(hwnd, WM_SETICON, 0, (LPARAM)icon);\r
+ SendMessage(hwnd, WM_SETICON, 1, (LPARAM)icon);\r
+}\r
+\r
+\r
+\r
void\r
startRecording()\r
{\r
ws::sendRequest("StartRecord");\r
+ changeIcon(hwnd, hInstance, IDI_ICON_GREEN);\r
}\r
\r
void\r
stopRecording()\r
{\r
ws::sendRequest("StopRecord");\r
+ changeIcon(hwnd, hInstance, IDI_ICON_RED);\r
}\r
\r
bool\r
return strcmp(filename, exeName.c_str()) == 0;\r
}\r
\r
-bool recording = false;\r
-HANDLE process = NULL;\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
+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
+ 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.hWnd = window.hwnd;\r
+ niData.uCallbackMessage = ICON_MSG;\r
+ niData.uVersion = NOTIFYICON_VERSION_4;\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
\r
- //win::Window window("Title", "MyWindowClass", hInstance);\r
- win::Window window("Title", "MyWindowClass", GetModuleHandle(0));\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
\r
lay_context *ctx = &window.ctx;\r
lay_id root = window.lId;\r
\r
- win::Hwnd row1(&window, &window, 0, 0, 0, 25, LAY_ROW, LAY_LEFT);\r
- lay_set_margins_ltrb(ctx, row1.lId, 5, 5, 5, 5);\r
- win::Hwnd row2(&window, &window, 0, 0, 0, 0, LAY_ROW, LAY_FILL);\r
- lay_set_margins_ltrb(ctx, row2.lId, 5, 5, 5, 5);\r
+ lay_id row1 = win::createLayId(&window.ctx, window.lId, 0, 25, LAY_ROW, LAY_LEFT);\r
+ lay_set_margins_ltrb(ctx, row1, 5, 5, 5, 5);\r
+ lay_id row2 = win::createLayId(&window.ctx, window.lId, 0, 0, LAY_ROW, LAY_FILL);\r
+ lay_set_margins_ltrb(ctx, row2, 5, 5, 5, 5);\r
\r
- win::CheckBox cbWindowTitle(&window, &row1, "Window Title", 100, 25, 0, 0);\r
- win::CheckBox cbFullscreenWindow(&window, &row1, "Any Fullscreen Application", 200, 25, 0, 0);\r
+ win::CheckBox cbWindowTitle(&window, "Window Title", row1, 100, 25, 0, 0);\r
+ win::CheckBox cbFullscreenWindow(&window, "Any Fullscreen Application", row1, 200, 25, 0, 0);\r
\r
- win::Button btnConnect(&window, &row1, "Connect", 100, 25, 0, 0);\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
+ });\r
\r
- win::ListBox lstActiveProcesses(&window, &row2, 0, 0, 0, LAY_FILL);\r
+ win::ListBox lstActiveProcesses(&window, row2, 0, 0, 0, LAY_FILL);\r
\r
- win::Hwnd col1(&window, &row2, 0, 0, 80, 0, LAY_COLUMN, LAY_VCENTER);\r
- lay_set_margins_ltrb(ctx, col1.lId, 5, 0, 5, 0);\r
-\r
- win::ListBox lstMonitoredProcesses(&window, &row2, 0, 0, 0, LAY_FILL);\r
+ lay_id col1 = win::createLayId(&window.ctx, row2, 80, 0, LAY_COLUMN, LAY_VCENTER);\r
lstActiveProcesses.addStyle(WS_VSCROLL);\r
+ \r
+ lay_set_margins_ltrb(ctx, col1, 5, 0, 5, 0);\r
+\r
+ win::ListBox lstMonitoredProcesses(&window, row2, 0, 0, 0, LAY_FILL);\r
lstMonitoredProcesses.addStyle(WS_VSCROLL);\r
\r
- win::Button btnUpdateWindows(&window, &col1, "Update", 85, 25, 0, 0);\r
- win::Button btnStartMonitoringName(&window, &col1, "Exe name >>", 85, 25, 0, 0);\r
- win::Button btnStartMonitoringPath(&window, &col1, "Full path >>", 85, 25, 0, 0);\r
- win::Button btnStopMonitoring(&window, &col1, "Remove", 85, 25, 0, 0);\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
+ win::Button btnStopMonitoring(&window, "Remove", col1, 85, 25, 0, 0);\r
btnUpdateWindows.onClick([&]() {\r
lstActiveProcesses.clear();\r
for (HWND hwnd = GetTopWindow(NULL); hwnd != nullptr;\r
});\r
\r
window.show();\r
+ window.setDefaultFont();\r
\r
+ ws::onConnect = [&]() {\r
+ changeIcon(window.hwnd, hInstance, IDI_ICON_RED);\r
+ };\r
ws::init();\r
\r
SetTimer(window.hwnd, 10123, 100, [](HWND, UINT, UINT_PTR, DWORD) {\r
if (!recording) {\r
- if (checkForegroundProcess("League of Legends.exe")) {\r
+ if (checkForegroundProcess("notepad.exe")) {\r
recording = true;\r
process = getHwndProcess(GetForegroundWindow());\r
startRecording();\r